ERRO AO CARREGAR UM ARQUIVO DO MS WORD POR STREAME

LUIS.HERRERA 27/01/2017 10:23:00
#471088
Amigos bom dia!
Estou com erro muito estranho. Tenho o MS Officer 2007 e Visual Studio 2008.
Meu sistema é criado em C#.
Uma das rotinas é abrir por FileStream um arquivo qualquer, compactar no formato ZIP e gravar no Banco SQL Server. [txt-color=#0000f0]OK Tudo funcionando perfeitamente[/txt-color].

Meu problema é com os arquivos do MS Word (Doc ou Docx). Ao carregar este tipo de arquivo usando FileMode.Open, surge uma mensagem de erro do Word, conforme ilustração. A rotina continua funcionando perfeitamente, porém a cada novo arquivo usado na rotina uma nova mensagem de erro é aberta e assim por diante.

Verifiquei no Gerenciador de Tarefas do Windows e cada mensagem corresponde a um novo Processo do WINWoRD.EXe como também pode ser visto na imagem. Essas mensagens do Word só podem ser fechadas clicando nos botões OK de cada uma, mas mesmo assim os processos no Gerenciador do Windows continuam ativos.

Alguém tem idéia do que é isso e como resolver? Meu sistema pode ter vários documentos tratados e isso pode comprometer o funcionamento do micro, além de causar trabalho aos usuários. o código que usei no C# é esse.

Não preciso abrir o Word, só o arquivo para ser zipado só isso. Estou usando a biblioteca using ICSharpCode.SharpZipLib.Zip;

 using (FileStream arquivo = new FileStream(myCaminhoNomeArquivoOrigem, FileMode.Open, FileAccess.Read))     [txt-color=#e80000]// a mensagem surge após executar essa linha[/txt-color]
{
ZipOutputStream objZipDestino = new ZipOutputStream(objStreamDestino);

try
{
//carregamento do streamen aqui.....
}Catch() {}

TUNUSAT 27/01/2017 11:30:31
#471093
LUIS HERRERA,

Podemos fazer um teste? Não sei se é o caso...
A mensagem de erro não especifica o que aconteceu... eu acredito que o arquivo ficou [Ô]lockado[Ô] (preso intencionalmente).

Estava vendo esta página:

------------------------------------------------------------------------------------------------------------

C#: Abrir um arquivo do Word em um FileStream para leitura enquanto ele é aberto no Word

http://stackoverflow.com/questions/3675002/c-opening-a-w

ord-file-in-a-filestream-for-reading-while-it-is-opened-in-word

------------------------------------------------------------------------------------------------------------

A recomendação de correção pelo que eu entendi é trocar a forma de abertura do arquivo de [Ô].Read[Ô] para [Ô].ReadWrite[Ô]

Try FileShare.ReadWrite. The explanation at http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx implies that using FileShare.Read conflicts with other processes trying to write.

[Ô]... conflitos com outros processos tentando gravar.[Ô]


O motivo é explicado aqui:

https://msdn.microsoft.com/pt-br/library/system.io.fileshare.aspx


[][ô]s,
Tunusat.
KURTGU 27/01/2017 11:54:43
#471094
toda vez você tem que fechar o arquivo via codigo apos abrir ele..
LUIS.HERRERA 27/01/2017 12:14:39
#471095
Tunusat, pelo que ví no tópico o problema dele é se tentar abrir um arquivo já aberto, o que não ocorre comigo. No meu caso o arquivo está fechado, então quando ele é aberto para carregar o Stream abre essa caixa de diálogo do Word dizendo que ocorreu um problema e em seguida a segunda dizendo que não pode fechar o Word pois existe uma caixa de diálogo aberta.

Nenhum outro programa abriu o arquivo, só o meu, o pior é que cada novo arquivo inicia um novo processo no Gerenciador de tarefas e todas ficam abertas, mesmo fechando a caixa de diálogo, isso é muito estranho.

Tentei trocando pelo ReadWrite mas deu o mesmo problema.


KURTGU eu fecho sim, sempre, mas o fato de abrir um arquivo não deveria exibir uma caixa de mensagem do Word. Se está abrindo é algum problema justamente na abertura via C#, pois independe do arquivo do Word, já abrindo pelo próprio word não exibe nada, então deve ser algo no Stream.
LUIS.HERRERA 27/01/2017 14:33:41
#471101
Descobri uma outra coisa. Para carregar o arquivo eu abro uma tela do FileDialog para o usuário selecionar o arquivo e ativar a rotina de zipar assim:
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//código de validação e chamada da rotina para zipar.
ArquivoCompactarParaZIP(openFileDialog1.FileName);
}


A caixa de diálogo do Word abria quando nesta rotina executava este código.
using (FileStream arquivo = new FileStream(myCaminhoNomeArquivoOrigem, FileMode.Open, FileAccess.Read)) 


Então fiz um teste, ao invés de passar o nome do arquivo pela dialog, usei uma variável string com o caminho e fechei o dialog antes de chamar a rotina de zipar.
Com isso a caixa de diálogo do Word aparece no momento que finaliza o Dialog e não mais dentro da rotina Using.

openFileDialog1.Dispose();
ArquivoCompactarParaZIP(sSomenteLinkEmRevisao + sSomenteNomeArquivoEmRevisao);


Agora a questão, o que efetivamente aciona essa caixa de mensagem do Word? Abrir o arquivo para stream ou executar o Dispose do controle FileDialog ?

Não estou entendendo porque o C# está criando um processo do Word no gerenciador do Windows, se estou abrindo somente um arquivo para ler seus bytes e não executando o Word.

[txt-color=#e80000]A última: é para deixar louco !!!!![/txt-color]

Isso tudo só acontece em modo Debug, depois de compilar em RELEASE não acontece mais. Dá pra acreditar?
DS2T 27/01/2017 18:31:14
#471105
Olá amigo.

Acho que existem duas soluções para seu problema:

Primeira:

Troque essa linha:

using (FileStream arquivo = new FileStream(myCaminhoNomeArquivoOrigem, FileMode.Open, FileAccess.Read)) 


Por essa (usando FileShare)

            using (FileStream arquivo= new FileStream(myCaminhoNomeArquivoOrigem, FileMode.Open, FileAccess.Read, FileShare.Read))



Segunda:

Ao invés de usar um FileStream, use um MemoryStream.
Use o método File.ReadAllBytes para retornar um array de bytes e jogue pro seu memoryStream. Por sua vez, passe esse MemoryStream pro ZipOutputStream.


Abraços!

LUIS.HERRERA 30/01/2017 07:07:35
#471132
DS2T tentei usar o FileShare, mas não mudou nada.

Quando a segunda opção, fui pesquisar sobre esse MemoryStream, mas para usá-lo tem que usar também o FileStream para carregar o arquivo, então não mudaria nada. Além disso, como expliquei no último comentário, fiz um teste de fechar o FileDialog antes de chamar o método de compactar, e a tal mensagem do Word já aparece, mesmo antes de usar o FileStream. Assim o problema ocorre ao selecionar o arquivo com o FileDialog e não propriamente com o FileStream.

Como não achei solução, vou deixar assim mesmo, já que aparentemente o problema não ocorre após compilar o código.
Tópico encerrado , respostas não são mais permitidas