删除空文件夹并重新创建后,System.IO.DirectoryNotFoundException

时间:2010-11-18 15:21:40

标签: c# exception file copy

我想复制一个文件夹,我想先删除目标文件夹。 所以我删除目标文件夹然后重新创建它,然后复制文件。 问题是我得到An unhandled exception of type 'System.IO.DirectoryNotFoundException' occurred in mscorlib.dll 在尝试复制文件时。这是代码

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 = new FileInfo(dest);中获得了例外。

似乎文件夹的创建存在延迟,同时我尝试将文件复制到其中。有任何线索,有什么问题?完整的异常消息:

  

未处理的类型异常   'System.IO.DirectoryNotFoundException'   发生在mscorlib.dll

     

其他信息:找不到   路径的一部分   'C:\用户\乔\桌面\ destfolder \ .buildpath'

正如好人所指出的,这个例外的原因是我尝试在删除过程完成之前重新创建文件夹。 因此解决方案是在删除后添加2行代码: 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);
    }.......

这样,您等待创建,直到删除过程完成。 Yhanks所有人,特别是Saeed。

7 个答案:

答案 0 :(得分:4)

我对你目前的解决方案感到困惑。 GC与删除文件夹无关,它只能起作用,因为添加GC相关功能类似于添加Thread.Sleep()或MessageBox。它只是偶然的。

相反,您应该等到实际删除目录,例如:

Directory.Delete(destFolder, true);  // delete folder
while(Directory.Exists(destFolder))
{
Thread.Sleep(100);
}

只有在此代码完成后,您才能继续。

答案 1 :(得分:1)

尝试使用FileIO方法,我有同样的问题,下面的代码工作完美。

FileIO.FileSystem.DeleteDirectory(目录名,FileIO.DeleteDirectoryOption.DeleteAllContent)

答案 2 :(得分:0)

为什么要在复制文件后设置文件属性?这有必要吗?

您可以做的是先设置不同的属性,然后再进行实际的文件复制。它也更有意义,首先检查它是否是ReadOnly文件,如果是,则将其设置为Normal,然后进行复制。

答案 3 :(得分:0)

很抱歉回答但没有发表评论,但我的声誉还不高。在编写MSDN时,路径必须“格式良好” http://msdn.microsoft.com/en-gb/library/system.io.fileinfo%28v=VS.90%29.aspx

也许尝试一下,把文件放在工作目录中?因此,不需要路径,您可以查看问题是在路径中还是在文件中...

答案 4 :(得分:0)

好的,这很奇怪。 仅当目标文件夹为空时才会发生异常。 但删除目标文件夹后添加下面的行似乎解决了问题。 这条线: MessageBox.Show(“文件夹”+ destFolder +“文件夹已删除”,“警告”);

static public void CopyFolder(string sourceFolder, string destFolder)
    {
        if (Directory.Exists(destFolder)) // check if folder exist
        {
            Directory.Delete(destFolder, true);  // delete folder
            MessageBox.Show("folder " + destFolder + "folder was deleted", "alert");
        }
        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);
        }

因此在删除后放置MessageBox.show会导致System.IO.DirectoryNotFoundException消失。好像删除后有一个小延迟的事实,文件夹的重新创建顺利。 我想我会找到一个解决这个问题的工作,但是如果有人知道是什么导致这个问题以及解决问题的方法,我会很高兴听到它。

答案 5 :(得分:0)

首先尝试设置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);

    }.......

答案 6 :(得分:-1)

你有点不对劲。异常的原因是仍然有一个资源正在访问文件夹(或文件)。

解决方案绝不是GC.collect()Sleep() ......这只是一种解决方法。 你正在做的只是让垃圾收集器处理资源,然后给它时间采取行动。

RIGHT 方式是管理您自己的资源。不使用您无法控制的静态方法,而是使用using块并在块的末尾处置资源。这样,在等待不受您控制的事情(GC)时,没有任何开销。

使用控制资源的对象,using块将在最后处置它。

在您的情况下,使用控制该资源的单个DirectoryInfo对象应该有效。

相关问题