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);
}