Usuário com melhor resposta
The process cannot access the file ' because it is being used by another process.

Pergunta
-
Bom Dia a todos.
Tenho um programa, aonde pego um excel TemplateMemoriaCalculo.xlsx e insiro alguns dados nele, e gravo em cima de outro excel que esta na mesma pasta MemoriaCalculo.xlsx.
Porem quando tento gravar esse excel, eu tenho esse erro The process cannot access the file 'C:\ProjetoNucleo\Nucleo2\Nucleo\Nucleo\bin\MemoriaCalculo.xlsx' because it is being used by another process.
E logo depois tenho abrir o excel manualmente, e acontece esse erro, O Excel não pode abrir o arquivo 'MemorialCalculo.xlsx' porque o formato ou a extensão de arquivo não é válida. Verifique se o arquivo não esta corrompido e se a extensão corresponde ao formato do arquivo.
O problema é que consigo abrir o Excel antes de passar pela a rotina, e ele não esta aberto quanto tento altera-lo via sistema.
O bloco do código é esse
if (System.IO.Directory.Exists(_Origem)) { string[] files = System.IO.Directory.GetFiles(_Origem); // Copy the files and overwrite destination files if they already exist. foreach (string s in files) { // Use static Path methods to extract only the file name from the path. //string s = "TemplateMemoriaCalculo.xlsx"; _NomeOrigem = System.IO.Path.GetFileName(s); destFile = System.IO.Path.Combine(_Destino, _NomeDestino); System.IO.File.Copy(s, destFile, true); } }
E o erro da nessa linha aqui.
System.IO.File.Copy(s, destFile, true);
Alguém poderia me ajudar?
Respostas
-
Vc tem que abrir o arquivo joga-lo em um stream e fecha-lo, o erro é pq vc está tentando fazer alguma operação no arquivo sendo que ele foi aberto por outro processo.
Junior
- Marcado como Resposta Pandox segunda-feira, 18 de novembro de 2013 16:39
Todas as Respostas
-
Vc tem que abrir o arquivo joga-lo em um stream e fecha-lo, o erro é pq vc está tentando fazer alguma operação no arquivo sendo que ele foi aberto por outro processo.
Junior
- Marcado como Resposta Pandox segunda-feira, 18 de novembro de 2013 16:39
-
Junior, obrigado pela resposta.
Mas não vejo aonde posso estar abrindo esse arquivo no bloco de código que estou usando.
public void CopiarArquivo(string _Origem, string _Destino, string _NomeOrigem, string _NomeDestino) { string sourceFile = System.IO.Path.Combine(_Origem, _NomeOrigem); string destFile = System.IO.Path.Combine(_Destino, _NomeDestino); if (!System.IO.Directory.Exists(_Destino)) { System.IO.Directory.CreateDirectory(_Destino); } System.IO.File.Copy(sourceFile, destFile, true); if (System.IO.Directory.Exists(_Origem)) { string[] files = System.IO.Directory.GetFiles(_Origem); foreach (string s in files) { _NomeOrigem = System.IO.Path.GetFileName(s); destFile = System.IO.Path.Combine(_Destino, _NomeDestino); System.IO.File.Copy(s, destFile, true); } } else { Console.WriteLine("Source path does not exist!"); } }
-
Mais vc faz uma referencia ao arquivo o ideal é vc jogar esse arquivo para um filestream ler ou fazer uma copia dele e fechar o filestream, ai sim vc vai poder referencia-lo novamente.
Tenho uma pagina onde eu leio um arquivo texto e importo os dados dele no banco, automaticamente o iis faz uma copia desse arquivo, caso o usuario feche a pagina antes do término se ele tentar importar o arquivo novamente dará esse mesmo seu erro, ai tenho que esperar de 20 a 30 minutos para o servidor iis liberar o arquivo, no meu caso nao tenho como fechar o stream pq saio lendo linha a linha.
Se vc quer apenas identicar o arquivo faça a refencia e depois libere(filestream.close()).
Junior
-
-
Olha esse link a pessoa teve a mesma duvida que vc
http://microsoft.public.br.dotnet.languages.csharp.narkive.com/f5uIS6Ca/fechando-um-arquivo-no-c
Junior
-
-
Coloca ai como vc esta fazendo ? vou te passar um exemplo meu
string WL_nomearquivo = ""; WL_nomearquivo = HttpContext.Current.Server.MapPath("~/arquivos/importantes/Resumido_" + cdempr + ".txt"); FileInfo arquivo = new FileInfo(HttpContext.Current.Server.MapPath("~/arquivos/importantes/Resumido_" + cdempr + ".txt")); if (arquivo.Exists) { arquivo.Delete(); } ////preparando o arquivo para ser gravado System.IO.TextWriter arquivos = System.IO.File.AppendText(WL_nomearquivo);
Junior
-
Estou fazendo assim:
public void CopiarArquivo(string _Origem, string _Destino, string _NomeOrigem, string _NomeDestino) { string sourceFile = System.IO.Path.Combine(_Origem, _NomeOrigem); string destFile = System.IO.Path.Combine(_Destino, _NomeDestino); if (!System.IO.Directory.Exists(_Destino)) { System.IO.Directory.CreateDirectory(_Destino); } System.IO.File.Copy(sourceFile, destFile, true); if (System.IO.Directory.Exists(_Origem)) { string[] files = System.IO.Directory.GetFiles(_Origem); System.IO.FileStream fsPedido = null; System.IO.StreamReader srPedido = null; fsPedido = new System.IO.FileStream(destFile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read); srPedido = new System.IO.StreamReader(fsPedido); string strLine = string.Empty; fsPedido.Close(); foreach (string s in files) { //var file = new System.IO.FileStream(destFile, System.IO.FileMode.Open, System.IO.FileAccess.Read); //var reader = new System.IO.StreamReader(file); //reader.Close(); //file.Close(); _NomeOrigem = System.IO.Path.GetFileName(s); destFile = System.IO.Path.Combine(_Destino, _NomeDestino); System.IO.File.Copy(s, destFile, true); } } else { Console.WriteLine("Source path does not exist!"); } }
-
-
-
-
-
Junior, fiz algumas alterações e acabou jogando de forma correta agora, isso no VS tanto local quanto no VS do Servidor.
O Microsoft Office Excel não pode acessar o arquivo 'C:\inetpub\wwwroot\bin\MemoriaCalculo.xlsx'. Há várias razões possíveis:
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
• O nome do arquivo ou caminho não existe.
• O arquivo está sendo usado por outro programa.
• O nome da pasta de trabalho que você está tentando salvar é o mesmo de outra pasta de trabalho aberta no momento.
Exception Details: System.Runtime.InteropServices.COMException: O Microsoft Office Excel não pode acessar o arquivo 'C:\inetpub\wwwroot\bin\MemoriaCalculo.xlsx'. Há várias razões possíveis:
• O nome do arquivo ou caminho não existe.
• O arquivo está sendo usado por outro programa.
• O nome da pasta de trabalho que você está tentando salvar é o mesmo de outra pasta de trabalho aberta no momento.
Source Error:Line 130: #region << Inicializa Objetos >> Line 131: Line 132: Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); Line 133: Microsoft.Office.Interop.Excel.Workbook workbook = excelApp.Workbooks.Open((_Destino + _NomeDestino), 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); Line 134:
Source File: C:\ProjetoNucleo\Nucleo2\Nucleo\Nucleo\Nucleo\MedicaoControle\Relatorios\Memoria_Calculo.cs Line: 132
Stack Trace:[COMException (0x800a03ec): O Microsoft Office Excel não pode acessar o arquivo 'C:\inetpub\wwwroot\bin\MemoriaCalculo.xlsx'. Há várias razões possíveis: • O nome do arquivo ou caminho não existe. • O arquivo está sendo usado por outro programa. • O nome da pasta de trabalho que você está tentando salvar é o mesmo de outra pasta de trabalho aberta no momento.] Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad) +0 Nucleo.MedicaoControle.Relatorios.Memoria_Calculo.Manipular(RelatorioModel _rel, ObterCompetenciaModel _cpt) in C:\ProjetoNucleo\Nucleo2\Nucleo\Nucleo\Nucleo\MedicaoControle\Relatorios\Memoria_Calculo.cs:132 Nucleo.Controllers.MedicaoControle.RelatoriosController.set(RelatorioModel _Relatorio) in C:\ProjetoNucleo\Nucleo2\Nucleo\Nucleo\Controllers\MedicaoControle\RelatoriosController.cs:60 System.Web.Mvc.<>c__DisplayClass1.<WrapVoidAction>b__0(ControllerBase controller, Object[] parameters) +15 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +264 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39 System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +129 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +826266 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +314 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +825488 System.Web.Mvc.Controller.ExecuteCore() +159 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335 System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62 System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20 System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.272Tenho esse caminho tanto no servidor, quanto na minha maquina, e mesmo assim ele fala que o arquivo não existe ou não pode ser aberto.
-
-
-
Minha sugestão é usar o mesmo código que voce estava usando antes, porem com algumas pequenas modificações.
O ideal é sempre utilizar o using em objetos que implementem a interface IDisposible.
Faça o teste:
foreach (string s in files) { _NomeOrigem = System.IO.Path.GetFileName(s); destFile = System.IO.Path.Combine(_Destino, _NomeDestino); using(var inputFile = new FileStream(s, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var outputFile = new FileStream(destFile, FileMode.Create)) { var buffer = new byte[0x10000]; int bytes; while ((bytes = inputFile.Read(buffer, 0, buffer.Length)) > 0) { outputFile.Write(buffer, 0, bytes); } } } }
AbraçosWashington Luíz | MCP, MCTS
O Senhor é minha força e somente Nele confio. -
vc tem q fazer um dispose no seu object
yourFile.Dispose();
Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC
-
Minha sugestão é usar o mesmo código que voce estava usando antes, porem com algumas pequenas modificações.
O ideal é sempre utilizar o using em objetos que implementem a interface IDisposible.
Faça o teste:
foreach (string s in files) { _NomeOrigem = System.IO.Path.GetFileName(s); destFile = System.IO.Path.Combine(_Destino, _NomeDestino); using(var inputFile = new FileStream(s, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var outputFile = new FileStream(destFile, FileMode.Create)) { var buffer = new byte[0x10000]; int bytes; while ((bytes = inputFile.Read(buffer, 0, buffer.Length)) > 0) { outputFile.Write(buffer, 0, bytes); } } } }
Abraços
Washington Luíz | MCP, MCTS
O Senhor é minha força e somente Nele confio.Washington, obrigado pela resposta.
Fiz do jeito que você solicitou e continua com
Lembrando que o erro só ocorre quando faço o deploy o deploy da aplicado, rodando pelo VS tanto na minha maquina, quanto no servidor, roda normal.
-
-
Tenta usar o mappath assim vc não precisa colocar o caminho completo faz assim :
caminho = MapPath("/Arquivos/importantes/");
Junior
Junior, obrigado pela resposta.
Aonde e como informo esse caminho?
Meu código esta assim agora.
public void CopiarArquivo(string _Origem, string _Destino, string _NomeOrigem, string _NomeDestino) { string sourceFile = System.IO.Path.Combine(_Origem, _NomeOrigem); string destFile = System.IO.Path.Combine(_Destino, _NomeDestino); if (!System.IO.Directory.Exists(_Destino)) { System.IO.Directory.CreateDirectory(_Destino); } // System.IO.File.Copy(sourceFile, destFile, true); if (System.IO.Directory.Exists(_Origem)) { string[] files = System.IO.Directory.GetFiles(_Origem); System.IO.FileStream fsPedido = null; System.IO.StreamReader srPedido = null; fsPedido = new System.IO.FileStream(destFile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read); srPedido = new System.IO.StreamReader(fsPedido); string strLine = string.Empty; fsPedido.Close(); foreach (string s in files) { _NomeOrigem = System.IO.Path.GetFileName(s); destFile = System.IO.Path.Combine(_Destino, _NomeDestino); using (var inputFile = new System.IO.FileStream(s, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)) { using (var outputFile = new System.IO.FileStream(destFile, System.IO.FileMode.Create)) { var buffer = new byte[0x10000]; int bytes; while ((bytes = inputFile.Read(buffer, 0, buffer.Length)) > 0) { outputFile.Write(buffer, 0, bytes); } } } } } else { Console.WriteLine("Source path does not exist!"); } }
-
-
onde vc monta o caminho para o arquivo e o que o Sailor sugeriu vc coloca após vc fechar o fspedido.close(); fspedido.dispose();
Junior
Aonde eu pego o caminho é aqui.
if (_NmDestino == "MemoriaCalculo.xlsx") { this.OrigemRelatorio = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6); this.OrigemRelatorio = OrigemRelatorio + "\\"; //EXCEL\\TEMPLATES\\MEMOCALC\\"; }
e o caminho que ele me retorna é esse:
'C:\inetpub\wwwroot\bin\MemoriaCalculo.xlsx'
E coloquei o
fsPedido.Close(); fsPedido.Dispose();
e infelizmente continua com o erro.
-
-
-
Altera o teu comando :
string destFile = System.IO.Path.Combine(_Destino, _NomeDestino);
para esse aquistring caminho = ""; //lendo diretório importantes/empresa caminho = MapPath("/Arquivos/importantes/");
Onde "/arquivos/importantes é o caminho físico onde está o teu arquivo.
Junior
-
Junior, bom dia!
eu tentei conforme você solicitou,]
'C:/inetpub/wwwroot/bin/MemoriaCalculo.xlsx' is a physical path, but a virtual path was expected.'
o Código ficou assim:
string destFile = ""; //lendo diretório importantes/empresa destFile = System.Web.HttpContext.Current.Server.MapPath("C:/inetpub/wwwroot/bin/");
Lembrando que o erro ja da pelo proprio VS.
Obrigado
Leandro
- Editado Pandox quarta-feira, 19 de junho de 2013 12:44 Falta informaçao
-
-
Olá Leandro.
Neste exemplo da Microsoft é realizada a cópia de todos os arquivos de um diretório para outro. A mudança que pude observar é que não é recuperado uma lista com os nomes dos arquivos e sim uma lista de FileInfo.
Ao invés de usar
string[] files = System.IO.Directory.GetFiles(_Origem);
é usado:
DirectoryInfo dir = new DirectoryInfo(sourceDirName); FileInfo[] files = dir.GetFiles(); foreach (FileInfo file in files) { string temppath = Path.Combine(destDirName, file.Name); file.CopyTo(temppath, false); }
Veja se te ajuda.
http://msdn.microsoft.com/en-us/library/bb762914.aspx
Washington Luíz | MCP, MCTS
O Senhor é minha força e somente Nele confio. -
-
Junior, bom dia!
Fiz a alteração e obtive esse erro.
public void CopiarArquivo(string _Origem, string _Destino, string _NomeOrigem, string _NomeDestino) { string sourceFile = System.IO.Path.Combine(_Origem, _NomeOrigem); string destFile = System.IO.Path.Combine(_Destino, _NomeDestino); if (!System.IO.Directory.Exists(_Destino)) { System.IO.Directory.CreateDirectory(_Destino); } // System.IO.File.Copy(sourceFile, destFile, true); if (System.IO.Directory.Exists(_Origem)) { string[] files = System.IO.Directory.GetFiles(_Origem); System.IO.FileStream fsPedido = null; System.IO.StreamReader srPedido = null; fsPedido = new System.IO.FileStream(destFile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read); srPedido = new System.IO.StreamReader(fsPedido); string strLine = string.Empty; fsPedido.Close(); foreach (string s in files) { _NomeOrigem = System.IO.Path.GetFileName(s); destFile = System.Web.HttpContext.Current.Server.MapPath("@c:/inetpub/wwwroot/bin/"); using (var inputFile = new System.IO.FileStream(s, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)) { using (var outputFile = new System.IO.FileStream(destFile, System.IO.FileMode.Create)) { var buffer = new byte[0x10000]; int bytes; while ((bytes = inputFile.Read(buffer, 0, buffer.Length)) > 0) { outputFile.Write(buffer, 0, bytes); } } } } } else { Console.WriteLine("Source path does not exist!"); } }
E obtive esse erro.
'@c:/inetpub/wwwroot/bin/' is not a valid virtual path.
Obrigado
Leandro
-
-
-
-
-
-
-