目录异常.转向Windows 7
本文关键字:Windows 转向 异常 | 更新日期: 2023-09-27 17:49:30
我继承了一个c#应用程序,它最近被部署到Windows 7工作站。在此之前,它已经在许多Windows XP工作站上运行,没有遇到下面的问题。
这段代码试图在线程中使用循环来移动目录。在Windows 7机器上,IOException被捕获。根据MSDN (http://msdn.microsoft.com/en-us/library/system.io.directory.move.aspx) IOException可以由3种情况引起。我想知道循环是否试图多次移动目录,这可能会导致"目标已经存在"条件。
症状是反复显示警告MessageBox,但移动最终会成功。从我对代码的解释来看,这应该只发生在60秒后(300 * 200ms),但它似乎几乎立即发生。
由于我对c#的经验非常少,而我对线程的经验更少,我在这里不知所措!我想知道这段代码是否有什么明显的错误。
相关代码段如下:
public static string archiveBatch(Batch myBatch, string from)
{
string to = "";
to = FileSystemManager.getArchivePath(myBatch, System.IO.Path.GetFileName(from));
threadedMove tm = new threadedMove(from ,to);
Thread t = new Thread(new ThreadStart(tm.run));
t.Priority = ThreadPriority.Highest;
t.Start();
return to;
}
private class threadedMove
{
string archivePath;
string fromPath;
public threadedMove(string from, string to)
{
archivePath = to;
fromPath = from;
}
public void run()
{
int errorCounter = 0;
while (true)
{
errorCounter++;
if (TryToMove(fromPath, archivePath)) { break; }
Thread.Sleep(200);
if (errorCounter > 300)
{
throw (new Exception("Warning: could not archive file from "+fromPath+" to "+archivePath));
}
}
}
}
private static bool TryToMove(string source, string destination)
{
try
{
//check if path is file or folder
if (System.IO.File.Exists(source))
{
//it is a file
if (!System.IO.File.Exists(destination))
{
System.IO.File.Move(source, destination);
}
}
else
{
//it is a directory
if (!System.IO.Directory.Exists(destination))
{
System.IO.Directory.Move(source, destination);
}
}
return true;
}
catch (IOException)
{
MessageBox.Show("Warning: could not archive file from " + source + " to " + destination", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
}
我将首先将异常消息输出到消息框中,看看它是否通过这样做来说明抛出异常的确切原因:
catch (IOException ex)
{
MessageBox.Show("Warning: could not archive file from " + source + " to " + destination + ". Error: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}
一旦你知道了原因,你就可以看看如何预防它
Batch
是什么?看起来它可能试图将它移动到相同的位置,这就是我对Batch