VERIFICAR SE ARQUIVO PDF ESTA ABERTO
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.
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.
Simplesmente gere o arquivo com um nome único. Além de ter um histórico dos relatórios, ainda vai evitar esse problema.
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.
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
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
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.
[ô]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.
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:
Espero que seja essa sua dúvida de como adaptar ao seu projeto.
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.
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:
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.
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.
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ã.
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ã.
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
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
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Ã
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Ã
Obrigado galera, consegui o que precisava, dando uma ajustada nos códigos que vocês me passaram:
Agora ficou assim:
E a função no Módulo:
Agora, sim funcionando corretamente.
Até mais.
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.
Tópico encerrado , respostas não são mais permitidas