Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#File.Delete不';不行_C#_.net_File Io - Fatal编程技术网

C#File.Delete不';不行

C#File.Delete不';不行,c#,.net,file-io,C#,.net,File Io,我试图从一个单独的线程中删除目录中的一些文件,但有时删除不起作用 DirectoryInfo dirInfo = new DirectoryInfo(Directory.GetCurrentDirectory()); FileInfo[] fileNames = dirInfo.GetFiles("*.*"); foreach (FileInfo fileName in fileNames) { string destinationFilename = cncDestinationDir

我试图从一个单独的线程中删除目录中的一些文件,但有时删除不起作用

DirectoryInfo dirInfo = new DirectoryInfo(Directory.GetCurrentDirectory());
FileInfo[] fileNames = dirInfo.GetFiles("*.*");
foreach (FileInfo fileName in fileNames)
{
    string destinationFilename = cncDestinationDirectory + @"\" + dirInfo.Name + @"\" + fileName.Name;
    if (File.Exists(destinationFilename))
        File.Delete(destinationFilename);

    File.Move(fileName.FullName, destinationFilename);
}
我的目标是移动目录中的一些文件,但据我所知,如果目标文件已经存在,则
File.move
不起作用。因此,我检查该文件是否存在,如果是真的,我将删除该文件,然后移到原始文件

文件.Delete
也会导致过早退出函数。 当前目录与正在运行的可执行文件的文件夹不同,因为我以前将其设置到了另一个文件夹中


如何避免这个错误?并且仍然移动目标目录中的文件?

您需要决定如何处理问题中建议的错误情况。在检查文件存在和删除文件之间,完全有可能是另一个进程打开了该文件。您可以捕获文件周围的异常。如果原始文件抛出,则删除并不移动该文件,但最终将得到未移动的文件。你对此无能为力

DirectoryInfo dirInfo = new DirectoryInfo(Directory.GetCurrentDirectory());
FileInfo[] fileNames = dirInfo.GetFiles("*.*");
foreach (FileInfo fileName in fileNames)
{
    string destinationFilename = cncDestinationDirectory + @"\" + dirInfo.Name + @"\" + fileName.Name;
    try
    {
        if (File.Exists(destinationFilename))
            File.Delete(destinationFilename);

        File.Move(fileName.FullName, destinationFilename);
    }
    catch(IOException exception)
    {
        Console.WriteLine($"Can't move file { filename.FullName}");
    }
}

存在的问题是,由于文件的只读属性,对该文件的访问被拒绝

因此,我将所有文件属性设置为正常,如下所示:

DirectoryInfo dirInfo = new DirectoryInfo(Directory.GetCurrentDirectory());
FileInfo[] fileNames = dirInfo.GetFiles("*.*");
foreach (FileInfo fileName in fileNames)
{
    if (fileName.Extension == ".iso")
        return;

    string destinationFilename = cncDestinationDirectory + @"\" + dirInfo.Name + @"\" + fileName.Name;
    fileName.Attributes = FileAttributes.Normal;
    if (File.Exists(destinationFilename))
    {
        File.SetAttributes(destinationFilename, FileAttributes.Normal);
        File.Delete(destinationFilename);
    }

    File.Move(fileName.FullName, destinationFilename);
}

“过早退出”?这是什么意思?你有例外吗?我看不出有问题……你需要决定如何像你在问题中建议的那样处理错误案例。在检查文件存在和删除文件之间,完全有可能是另一个进程打开了该文件。您可以捕获文件周围的异常。如果原始文件抛出,则删除并不移动该文件,但最终将得到未移动的文件。你对此无能为力。如果不抛出异常,这是不可能的。不管用什么方法调用,你都可能会默默地吞下它-永远不要这样做。潜在的情况是,你的防病毒软件会在你执行操作的同时尝试访问/锁定你试图移动的文件。我已经实现了try-catch语句,但它没有得到任何异常而不是IOException我使用了异常。它检索被拒绝的访问。但是没有防病毒程序或任何其他程序阻止文件。@KingofMaze如果文件可能是只读的,请尝试将文件属性设置为正常,如file.SetAttributes(fileName,FileAttributes.normal)@是的,就是这样。我已经找到问题了。谢谢。你是如何解决这个问题的?您是否检测到文件为R/O并相应地设置属性,或者跳过它们,或者做什么?我使用
file.SetAttributes(destinationFilename,FileAttributes.Normal)将所有文件属性设置为Normal