我有一个c#程序,我通过它打开cmd窗口作为一个过程。在此命令窗口中,我正在运行批处理文件。我正在将该批处理文件命令的输出重定向到文本文件。当我运行我的应用程序时,一切似乎都没问题。
但很少一次,Application会给出一些错误,例如“无法访问该文件。它正被另一个应用程序使用”,同时cmd窗口没有关闭。如果我们通过任务管理器关闭cmd进程,那么它将内容写入文件并关闭。即使我关闭了cmd进程,仍然没有释放文件句柄。所以我下次不能运行应用程序。总是它说不能访问该文件。只有在重新启动系统后,它才能正常工作。
这是我的代码:
Process objProcess = new Process();
ProcessStartInfo objProInfo = new ProcessStartInfo();
objProInfo.WindowStyle = ProcessWindowStyle.Maximized;
objProInfo.UseShellExecute = true;
objProInfo.FileName = "Batch file path"
objProInfo.Arguments = "Some Arguments";
if (Directory.Exists(strOutputPath) == false)
{
Directory.CreateDirectory(strOutputPath);
}
objProInfo.CreateNoWindow = false;
objProcess.StartInfo = objProInfo;
objProcess.Start();
objProcess.WaitForExit();
test.bat的:
java classname argument > output.txt
这是我的问题:
我无法追查问题所在..
我们如何看待持有ant文件句柄的过程。
是否有关于Java和.net互操作性的建议
答案 0 :(得分:1)
在这样的情况下,我启动Process Explorer(通过Sysinternals,很棒的工具顺便说一句)单击Ctrl + F,然后输入文件的名称。它将搜索所有正在运行的进程,并将打开它的应用程序列出该文件的文件句柄。
然后您可以放下句柄,或者杀死应用程序 - 无论您认为哪个更好)
答案 1 :(得分:0)
您可以尝试从C#中分叉和附加文件描述符,而不是启动bat文件。
答案 2 :(得分:0)
我认为问题是因为当C#程序在其上写东西时,java程序正在访问文本文件,因此“文件无法访问”问题。
如果我是你,我会用C#做所有事情 - 我不会用Java来读取C#程序的状态。只有在我完成C#需要做的任何事情之后,我才会访问该文件。
至于查看锁定文件的进程,可以使用Process Explorer来实现此目的。