C# 删除空文件夹并重新创建后System.IO.DirectoryNotFoundException
我想复制一个文件夹,我想先删除目标文件夹。 所以我删除目标文件夹,然后重新创建它,然后复制文件。 问题是我得到的C# 删除空文件夹并重新创建后System.IO.DirectoryNotFoundException,c#,exception,file,copy,C#,Exception,File,Copy,我想复制一个文件夹,我想先删除目标文件夹。 所以我删除目标文件夹,然后重新创建它,然后复制文件。 问题是我得到的在mscorlib.dll中发生了类型为'System.IO.DirectoryNotFoundException'的未处理异常 当试图复制文件时。这是密码 static public void CopyFolder(string sourceFolder, string destFolder) { if (Directory.Exists(destFolder
在mscorlib.dll中发生了类型为'System.IO.DirectoryNotFoundException'的未处理异常
当试图复制文件时。这是密码
static public void CopyFolder(string sourceFolder, string destFolder)
{
if (Directory.Exists(destFolder)) // check if folde exist
{
Directory.Delete(destFolder, true); // delete folder
}
Directory.CreateDirectory(destFolder); // create folder
string[] files = Directory.GetFiles(sourceFolder);
foreach (string file in files)
{
string name = Path.GetFileName(file);
string dest = Path.Combine(destFolder, name);
File.Copy(file, dest, true);
FileInfo fileinfo = new FileInfo(dest); // get file attrib
if (fileinfo.Attributes != FileAttributes.ReadOnly) // check if read only
File.SetAttributes(dest, FileAttributes.Normal);
}.......
我在这一行中得到异常FileInfo FileInfo=newfileinfo(dest)代码>
似乎在创建文件夹时出现了延迟,同时我尝试将文件复制到其中。有什么线索吗,有什么问题吗?完整的异常消息:
类型的未处理异常
'System.IO.DirectoryNotFoundException'
发生在mscorlib.dll中
其他信息:找不到
道路的一部分
“C:\Users\joe\Desktop\destfolder\.buildpath”
解决方案
正如好人所指出的,出现这种异常的原因是我在删除过程完成之前尝试重新创建文件夹。
因此,解决方案是在删除后添加两行代码:
GC.Collect();
GC.WaitForPendingFinalizers();
所以正确的代码是
static public void CopyFolder(string sourceFolder, string destFolder)
{
if (Directory.Exists(destFolder)) // check if folde exist
{
Directory.Delete(destFolder, true); // delete folder
GC.Collect(); // CODE ADDED
GC.WaitForPendingFinalizers(); // CODE ADDED
}
Directory.CreateDirectory(destFolder); // create folder
string[] files = Directory.GetFiles(sourceFolder);
foreach (string file in files)
{
string name = Path.GetFileName(file);
string dest = Path.Combine(destFolder, name);
File.Copy(file, dest, true);
FileInfo fileinfo = new FileInfo(dest); // get file attrib
if (fileinfo.Attributes != FileAttributes.ReadOnly) // check if read only
File.SetAttributes(dest, FileAttributes.Normal);
}.......
这样,您可以等待创建,直到删除过程完成。
Yhank所有人,尤其是Saeed。为什么在复制文件后要设置文件属性?这有必要吗
您可以做的是首先设置不同的属性,然后进行实际的文件复制。这也更有意义,首先检查它是否为只读文件,如果是,则将其设置为正常,然后进行复制 很抱歉回答,不发表评论,但我的声誉还不高。在MSDN中,路径必须“格式良好”
也许可以尝试一下,把文件放到工作目录中?因此不需要路径,您可以看到问题是在路径中还是在文件中…好的,这很奇怪。
只有当目标文件夹为空时,才会发生异常。
但在目标文件夹删除后添加以下行似乎可以解决问题。
该行:
MessageBox.Show(“文件夹”+destFolder+“文件夹已删除”,“警报”)
因此,在删除后放置MessageBox.show会导致System.IO.DirectoryNotFoundException消失。似乎在删除之后有一个小的延迟,文件夹的重新创建进展顺利。
我想我会找到解决这个问题的方法,但是如果有人知道是什么导致了这个问题以及解决方法,我会很高兴听到这个消息。尝试先设置dest的Fileinfo,然后复制
foreach (string file in files)
{
string name = Path.GetFileName(file);
string dest = Path.Combine(destFolder, name);
FileInfo fileinfo = new FileInfo(dest); // get file attrib
dest.Attributes = FileAttributes.Normal;
File.Copy(file, dest, true);
}.......
我对你目前的解决办法感到困惑。GC与删除文件夹无关,它只起作用,因为在其中添加GC相关功能类似于添加Thread.Sleep()或MessageBox。这只是偶然的
相反,您应该等到目录被实际删除,例如:
Directory.Delete(destFolder, true); // delete folder
while(Directory.Exists(destFolder))
{
Thread.Sleep(100);
}
只有这段代码完成后,您才应该继续。您弄错了。出现异常的原因是仍有一个资源正在访问该文件夹(或文件)
解决方案永远不是GC.collect()
或Sleep()
。。。那只是一种变通办法。
您所做的只是让垃圾收集器处理资源,然后给它时间采取行动
正确的方法是管理自己的资源。使用using
块并在块的末尾处置资源,而不是无法控制的静态方法。这样,在等待不在您控制(GC)范围内的事情时,就不会有开销
使用控制资源的对象,并且using
块将在最后处理它
在您的例子中,使用单个DirectoryInfo
对象来控制该资源应该工作。尝试使用FileIO方法,我遇到了同样的问题,下面的代码工作得非常完美
FileIO.FileSystem.DeleteDirectory(directoryName,FileIO.DeleteDirectoryOption.DeleteAllContent)如果文件夹存在,可能只删除其内容?是否确实要复制该文件?我建议使用一些调试代码,在复制之前输出源文件名和目标文件名,然后在复制完成后输出一条消息,上面写着“文件已复制”。复制似乎不太可能成功完成,然后对FileInfo
构造函数的调用失败。调试此操作时,引发异常的行上的dest
值是多少?其他相关变量的值是什么?如果目标文件夹不存在,而我运行它,则没有问题。但是如果文件夹存在并且是空的,那么我会得到异常。dest=“C:\\Users\\…\\destfolder\\.buildpath”您的异常消息是什么?我认为存在安全问题,请提供完整的异常消息我正在将文件属性设置为正常,因为如果存在只读文件,我在执行删除操作时会出现异常:p问题是目录未准备好使用,如果我尝试此操作,我会遇到相同的问题,没有目标文件夹。我认为您的程序是多线程的,因此当删除文件夹然后重新创建它时,负责复制的线程会在另一个完成之前启动。在目录删除之后,为什么不把目录创建代码放在if语句中呢?我认为你对导致此异常的原因是正确的,saeed已经指出了解决方案。现在,关于将目录创建放在if语句中-这将是代码的复制,因为如果文件夹不存在,我需要从if语句中再创建一个。用一个小睡眠替换messagebox。当文件系统需要一些时间来执行您要求它执行的操作时,可能会发生此类错误。因此,当您进行“创建”时,文件夹是
Directory.Delete(destFolder, true); // delete folder
while(Directory.Exists(destFolder))
{
Thread.Sleep(100);
}