Ir ao conteúdo
  • Cadastre-se
Gnomo Psicodélico

C Como checar se um arquivo ta aberto

Recommended Posts

 Como eu faço pra checar se um arquivo ou programa ta aberto?

Por exemplo eu crio um arquivo .txt e abro ele, no meu programa em C eu checo se ele ta aberto, se tiver checa de novo e se não tiver retorna 1.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gnomo Psicodélico para saber se o arquivo está aberto, você  verifica  ao abrir o arquivo para ler ,  com fopen  então se o arquivo for igual a NULL é porque  ele não está aberto .    mas não precisa checar duas vezes  pois se da primeira vez ele estiver aberto  então na segunda ele vai estar aberto do mesmo jeito, ou se não estiver aberto é a mesma coisa,  sendo que se você abrir o arquivo você precisa fecha-lo  e se abrir duas vezes  precisa fechar também duas vezes . 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça o que @devair1010 disse, apenas cheque se o valor retornado pelo fopen é igual a NULL(0)

FILE* arquivo = fopen("meuarquivo.txt", "r");

if (arquivo == NULL)
     printf("Erro ao abrir o arquivo, %d\n", GetLastError()); // Mostra a mensagem de erro e o código do erro

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Gnomo Psicodélico por que você simplesmente não usa a função system para executar os comandos do .bat em vez de criar um arquivo .bat?

 

system("shutdown -r -t 30"); // Apenas coloque o comando do .bat dentro das " "

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@cyer  Porque estou fazendo isso para apagar umas pastas e sub-pastas do programa que eu criei de tv e não queria que aparecesse uma tela preta do DOS executando um comando, por isso eu crio o .bat e executo com ShellExecute em modo SW_HIDE.
Tem alguma forma de executar system em modo sw_hide?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função system não mostra a janela do cmd, e também não é a melhor opção para isso, você pode usar funções da própria linguagem C para fazer isso como a função RemoveDirectory(para pastas) e a função remove(para arquivos) ou a função DeleteFile.

 

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@cyer  Eu sei remover pasta e arquivo, mas eu queria uma forma de remover pasta que contem arquivo dentro por isso criei um .bat pra remover, não achei nenhuma função que fizesse isso.
 A função system abre uma tela preta (prompt) quando é executada e depois que executa o comando ela fecha

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@cyer  rmdir,removedirectory,etc... Todas só deletam a pasta se não tiver nada dentro dela, eu queria alguma forma de remover a pasta com tudo que tem dentro sem ter que remover de forma manual arquivo por arquivo de cada pasta

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro apenas verifique se a pasta está vazia, se não estiver, você deleta.

#include <stdio.h>
#include <windows.h>

bool PastaVazia(const char* Caminho)
{
	WIN32_FIND_DATA pastaInfo = { 0 };

	HANDLE Pasta = FindFirstFileA(Caminho, &pastaInfo);

	if (Pasta == INVALID_HANDLE_VALUE)
		return false;

	do
	{
		// Verifica se o nome alternativo do arquivo é diferente de 0, se for igual a 0 significa que não existe
		if (pastaInfo.cAlternateFileName && pastaInfo.cAlternateFileName[0])
		{
			FindClose(Pasta);
			return false;
		}
	} while (FindNextFileA(Pasta, &pastaInfo));

	FindClose(Pasta);

	return true;
}

bool ApagarTodosArquivos(const char* Caminho)
{
	WIN32_FIND_DATA pastaInfo = { 0 };

	HANDLE Pasta = FindFirstFileA(Caminho, &pastaInfo);

	if (Pasta == INVALID_HANDLE_VALUE)
		return false;

	// Remove o *.* do caminho
	char CaminhoSemTipo[MAX_PATH] = { 0 };

	for (size_t i = strlen(Caminho) - 1; i--; )
	{
		if (Caminho[i] == '\\')
		{
			strncpy_s(CaminhoSemTipo, Caminho, i + 1);
			break;
		}
	}

	do
	{
		// Verifica se é a pasta atual
		if (pastaInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			continue;

		char d[MAX_PATH] = { 0 };

		// Copia o caminho sem o *.* para a d
		strcpy_s(d, CaminhoSemTipo);

		// Adiciona o nome do arquivo para o diretorio
		strcat_s(d, pastaInfo.cFileName);

		// Apaga o arquivo
		if (!DeleteFileA(d))
		{
			FindClose(Pasta);
			return false;
		}

	} while (FindNextFileA(Pasta, &pastaInfo));

	FindClose(Pasta);

	return true;
}

int main()
{

	bool Resultado = PastaVazia("C:\\Teste\\*.*");

	printf("Vazia: %i\n", Resultado); // *.* para checar todos os tipos de arquivos da pasta se existir arquivos nela


	if (!Resultado)
		ApagarTodosArquivos("C:\\Teste\\*.*");

	system("pause");

	return 0;
}

 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@cyer  Obrigado cyer, de tanto pesquisar acabei achando uma função que não conhecia e fazendo de uma forma mais simples (WinExec("cmd /C del /S /Q BD\\TV\\C1",SW_HIDE);)
 Mesmo assim muito obrigado por tentar ajudar

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×