DUVIDA FILE.MOVE
Boa tarde galera.
Estou tentando mover um arrquivo atraves de uma aplicação(vamos chama-la de A) feita em c#. Este arquivo é criado pelo meu sistema PDV Vb6(B), entao o A o move para outra pasta para que uma operação seja feita.
Estou usando o controle FileSystemWatcher para [Ô]vigiar[Ô] esta pasta.
Porem em algumas vezes meu programa A nao consegue mover pois ele ainda esta aberto no B ou talvez mesmo o anti virus escaneando ele entao nao consigo move-lo.
Tecnicamente como faço isso ? Pois o FileWatcher nao varre os arquivos que ja estao na pasta antes dele iniciar o monitoramento(ou tem e nao sei como faz).
Como eu faria pra resolver isso ? Pensei em dentro do evento Created do FSW eu fazer um laço ate que o arquivo nao esteja aberto em outro processo, mas nao sei como fazer isso.
Estou tentando mover um arrquivo atraves de uma aplicação(vamos chama-la de A) feita em c#. Este arquivo é criado pelo meu sistema PDV Vb6(B), entao o A o move para outra pasta para que uma operação seja feita.
Estou usando o controle FileSystemWatcher para [Ô]vigiar[Ô] esta pasta.
Porem em algumas vezes meu programa A nao consegue mover pois ele ainda esta aberto no B ou talvez mesmo o anti virus escaneando ele entao nao consigo move-lo.
Tecnicamente como faço isso ? Pois o FileWatcher nao varre os arquivos que ja estao na pasta antes dele iniciar o monitoramento(ou tem e nao sei como faz).
Como eu faria pra resolver isso ? Pensei em dentro do evento Created do FSW eu fazer um laço ate que o arquivo nao esteja aberto em outro processo, mas nao sei como fazer isso.
Segundo o MSDN, o FileSystemWatcher produz 1 (um) evento _created e X (xis) eventos _changed.
O pessoal do StackOverflow sugere adicionar o arquivo (no evento created) Ã uma lista e verificar se o arquivo esta liberado (IsFileLocked, abaixo) antes de copiá-lo, removendo-o da lista ao completar a operação.
O pessoal do StackOverflow sugere adicionar o arquivo (no evento created) Ã uma lista e verificar se o arquivo esta liberado (IsFileLocked, abaixo) antes de copiá-lo, removendo-o da lista ao completar a operação.
static bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open,
FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
Eu pensei em fazer isso, porem se ele estiver aberto nao vai copiar. E entao o arquivo vai ficar parado na pasta pois o evento Created nao é disparado mais.
Sim, o evento é disparado uma vez. Então, dentro dele, tu vai ter que criar um loop.
Algo assim:
Algo assim:
static void FswCreated(object sender, FileSystemEventArgs e)
{
string sFile = e.FullPath;
//Variável para pegar informações do arquivo
FileInfo fileInfo = new FileInfo(sFile);
//Chama função para testar se arquivo já foi liberado
while(IsFileLocked(fileInfo))
{
//Sleep pra esperar 500 ms e testar de novo
//Basicamente, o código será repetido até o arquivo ficar livre para cópia
Thread.Sleep(500);
}
//Aqui tu coloca o código pra copiar
}
static bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open,
FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//true = ainda não está pronto
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//falso = arquivo livre
return false;
}
Puts que vacilo, como nao pensei no While?
Estava querendo algo que fizesse isso mas esqueci uma das funções mais básicas.
Vou tentar aqui amigo, valeu !
Estava querendo algo que fizesse isso mas esqueci uma das funções mais básicas.
Vou tentar aqui amigo, valeu !
Tópico encerrado , respostas não são mais permitidas