2010-04-21 136 views
0

我有一个c#程序,通过它我打开cmd窗口作为一个过程。在这个命令窗口中我正在运行一个批处理文件。我将该批处理文件命令的输出重定向到文本文件。当我运行我的应用程序时,一切似乎都没有问题。Java和.net的互操作性

但很少有时候,应用程序出现一些错误,如“无法访问该文件,正在被另一应用程序使用”,同时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 

这里是我的问题:

  1. 我不能追踪问题的所在。 。

  2. 何我们可以看到在ant文件上持有句柄的过程。

  3. 是否有Java和.NET互操作有什么建议

回答

1

在这种情况下,我启动Process Explorer(通过Sysinternals,awesome tool btw)单击Ctrl + F,然后输入文件的名称。它将搜索所有正在运行的进程,并将打开的应用程序将文件句柄列出到该文件中。

然后,您可以放下手柄或杀死应用程序 - 无论您认为哪种方式更好)

+0

非常感谢...尽管它没有直接解决我的问题,但它帮助我确定了根本原因。 – Dinesh 2010-04-26 09:02:25

+0

那么问题是什么呢?我很好奇:) – 2010-04-26 09:18:32

0

你可以尝试分叉和C#附加的文件描述符,而不是启动一个bat文件。

+0

为什么要从父进程产生新进程。 AS fork会创建类似于Parent的子进程,我不能使用父进程来执行批处理文件。因为这里我的父类是一个excel应用程序。 请纠正我,如果我错了...... – Dinesh 2010-04-21 07:04:57

0

我认为这个问题是因为java程序正在访问文本文件,当C#程序正在写它的东西,因此“文件无法访问”的问题。

如果我是你,我会尽一切在C#中 - 我不会使用Java来读取C#程序的状态。而且,只有在完成C#需要完成的任何操作后,我才能访问该文件。

至于看看哪个进程锁定了你的文件,你可以使用Process Explorer来达到这个目的。

+0

它更像是,Java将能够访问源系统,但不能用于客户端开发。 C#可以用于客户端开发,但不能用于访问源系统。这就是为什么我使用这种方法。 – Dinesh 2010-04-21 07:19:12

+0

@dineshrekula,C#*可以*用于访问源系统 - 如果您正在MS平台上开发,我建议您仅使用C# – Graviton 2010-04-21 07:30:10

+0

无法访问源系统。我的源系统是Team Center.It是一个PLM工具。 – Dinesh 2010-04-21 10:17:24