VERIFICAR SE ARQUIVO PDF ESTA ABERTO

PERCIFILHO 20/12/2012 13:50:22
#416252
Olá, amigos.

Estou gerando um relatório em PDF e em seguida gravo ele em uma pasta específica com o nome Relatório.PDF e abro ele com o Adobe.
Pois bem, se o arquivo estiver aberto e eu minimizar, e tentar gerar novamente o mesmo arquivo, vai ocorrer um erro, correto?
Como faço para detectar que esse arquivo está aberto? Preciso emitir uma mensagem, ou gravar com outro nome, qualquer coisa, sei lá. Depois eu vejo o que eu faço com o arquivo. Só preciso mesmo é saber como detectar que ele está aberto.

Até mais.
KERPLUNK 20/12/2012 15:10:27
#416262
Simplesmente gere o arquivo com um nome único. Além de ter um histórico dos relatórios, ainda vai evitar esse problema.
LUIS.HERRERA 20/12/2012 15:12:42
#416264
Uma saída é gerar o erro e ver o código que ele gera, então faz o tratamento para esse código específico dando a mensagem que quiser.
ALEVALE 20/12/2012 15:16:10
#416265
Resposta escolhida
Não testei mas achei na net....

Private Function IsFileOpen(ByVal filename As String) As Boolean
Try
System.IO.File.Open(filename, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
FileClose(1)
Return False
Catch ex As Exception
Return True
End Try
End Function

http://stackoverflow.com/questions/11287502/vb-net-checking-if-a-file-is-open-before-proceeding-with-a-read-write
PERCIFILHO 20/12/2012 15:32:00
#416267
Olha, depois de todos os procedimentos para gerar o PDF ( com o PDFSharp.dll ), o código que salva o arquivo na pasta e abre o arquivo é o seguinte:

[ô]Salva o documento na pasta especificada
Dim filename As String = Application.StartupPath & [Ô]\Relatorio.pdf[Ô]
document.Save(filename)
Me.Close()
Process.Start(filename)

Ou seja, o relatório é gravado na pasta especificada, e aberto pelo AcrobatReader.
Como o relatório é gerado a todo momento, não quero que fiquem armazenados todos os arquivos gerados, apenas o último deverá ficar gravado.
Se o arquivo estiver aberto e outro usuário tentar abrí-lo, deverá aparecer uma mensagem alertando.

ALEVALE, não estou conseguindo adaptar o seu código no projeto. Pode me dar uma luz?

Até mais.
PEGUDO 20/12/2012 16:01:13
#416272
O ALEVALE lhe passou uma função do tipo Boolean, então você deve criar um variável Booleana para pegar o resultado dela.
Exemplo:

Private Function IsFileOpen(ByVal filename As String) As Boolean
Try
System.IO.File.Open(filename, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
FileClose(1)
Return False
Catch ex As Exception
Return True
End Try
End Function



Private Sub Botao_Click(ByVal ...) Handles ...
Dim Resposta as Boolean = IsFileOpen(Arquivo_PDF)

If Resposta Then Console.WriteLine([Ô]Aberto[Ô]) Else Console.WriteLine([Ô]Fechado[Ô])
End Sub

Espero que seja essa sua dúvida de como adaptar ao seu projeto.
PERCIFILHO 20/12/2012 16:26:20
#416273
Perdoem a minha ignorância, porém ainda assim não consegui:
Fiz assim:

a parte do programa que faz a parte de gravação e leitura do arquivo:

        [ô]Salva o documento na pasta especificada
Dim filename As String = Application.StartupPath & [Ô]\Relatorio.pdf[Ô]
document.Save(filename)
Dim Resposta As Boolean = IsFileOpen(filename)
If Resposta Then
MsgBox([Ô]Arquivo já está aberto[Ô])
Else
Process.Start(filename)
End If
Me.Close()




  Private Function IsFileOpen(ByVal filename As String) As Boolean
Try
System.IO.File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.None)
FileClose(1)
Return False
Catch ex As Exception
Return True
End Try
End Function



O Acrobat tenta abrir o arquivo, e aparece a mensagem que o arquivo já está sendo usado, porém, mesmo não estando sendo usado, o Acrobat emite a mesma mensagem.
PERCIFILHO 20/12/2012 17:02:58
#416276
E se ao invés disso, eu criasse um arquivo que quando eu fechasse o Acrobat ele fosse excluído, será que é possível?
Lembrando que aí é o Acrobat que tem o [Ô]controle[Ô] desse arquivo, ou seja, ele é aberto com o Acrobat e como eu conseguiria um comando para detectar que o Acrobat foi fechado para excluir esse arquivo?

Até amanhã.
ALEVALE 20/12/2012 17:06:52
#416277
Tenta assim:

Public Function FileInUse(ByVal sFile As String) As Boolean
If System.IO.File.Exists(sFile) Then
Try
Dim F As Short = FreeFile()
FileOpen(F, sFile, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.LockReadWrite)
FileClose(F)
Catch
Return True
End Try
End If
End Function

FORM:
Dim filename As String = (Application.StartupPath & [Ô]\[Ô] & [Ô]Documento1.pdf[Ô])

If FileInUse(filename) = False Then
Process.Start(filename)
Else
MsgBox([Ô]Arquivo aberto[Ô])
End If
PEGUDO 21/12/2012 07:51:24
#416293
Outra solução poderia ser:
Eu criei este código, criei uma arquivo chamado [Ô][txt-color=#0000f0]Relatório.pdf[/txt-color][Ô], abri este arquivo, rodei o programa, cliquei no botão e deu certo
.


Só tem uma coisa:
Em meus testes percebi que se eu abrisse mais de um arquivo pdf, somente o último arquivo pdf que era aberto, aparecia o nome, o restante retornava vazio e o programa não conseguia identifica-lo.
Este foi o único problema que eu encontrei neste exemplo.

Obsw: A linha [txt-color=#0000f0]Dim g = Processo.Threads[/txt-color] não faz diferença no código, eu que esqueci de apagá-la, Ok?

Qualquer coisa estamos aí
PERCIFILHO 21/12/2012 08:41:30
#416299
Obrigado galera, consegui o que precisava, dando uma ajustada nos códigos que vocês me passaram:
Agora ficou assim:

        [ô]Salva o documento na pasta especificada
Dim filename As String = (Application.StartupPath & [Ô]\[Ô] & [Ô]Relatorio & [Ô] & Environment.MachineName & [Ô].pdf[Ô])
If IsFileOpen(filename) = False Then
document.Save(filename)
Process.Start(filename)
Else
MsgBox([Ô]Arquivo já está aberto[Ô], MsgBoxStyle.Critical, [Ô]Erro de abertura[Ô])
End If
Me.Close()


E a função no Módulo:

   Public Function IsFileOpen(ByVal filename As String) As Boolean
Try
Dim F As Short = FreeFile()
FileOpen(F, filename, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.LockReadWrite)
FileClose(F)
Return False
Catch ex As Exception
Return True
End Try
End Function



Agora, sim funcionando corretamente.

Até mais.
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas