DUVIDA FILE.MOVE

FBGSYSTEMS 13/01/2016 15:42:35
#456095
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.
ASHKATCHUP 13/01/2016 16:37:59
#456097
Resposta escolhida
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.

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;
}
FBGSYSTEMS 13/01/2016 16:57:14
#456098
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.
ASHKATCHUP 14/01/2016 15:39:39
#456137
Sim, o evento é disparado uma vez. Então, dentro dele, tu vai ter que criar um loop.

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;
}
FBGSYSTEMS 14/01/2016 20:58:48
#456148
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 !
Tópico encerrado , respostas não são mais permitidas