2017-07-13 91 views
-2

我想从一个单独的线程删除目录中的某些文件,但有时删除不起作用。C#File.Delete不工作

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如果目标文件已经存在,不能正常工作。所以,我检查文件是否存在,如果它是真的,我删除这个文件,然后移动到原来的位置。

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

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

+0

“过早退出”?那是什么意思?你是否遇到异常? – DavidG

+1

我没有看到问题... – fredrik

+0

您需要决定如何处理您在问题中提出的错误案例。检查文件之间存在然后删除它是完全可能的,该文件已被另一个进程打开。你可以在File.Delete周围捕获一个异常,如果它抛出的话不会移动原始文件,但是你最终会得到未被移动的文件。你无能为力。 – Neil

回答

0

问题在于由于文件的只读属性而导致对文件的访问被拒绝。

所以,我把我所有的文件,正常属性为如下:

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

你如何解决这个问题?你是否检测到文件是R/O并相应地设置属性,或者跳过它们,或者是什么? – Neil

+0

我使用'File.SetAttributes(destinationFilename,FileAttributes.Normal);' 将所有文件属性设置为Normal,因为这些文件不需要任何特殊属性。 – KingOfMazes

1

您需要决定如何处理您在问题中提出的错误案例。检查文件之间存在然后删除它是完全可能的,该文件已被另一个进程打开。您可以捕获File.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}"); 
    } 
} 
+0

我已经实现了try-catch语句,但它没有得到任何异常 – KingOfMazes

+0

而不是IOException我已经使用了异常。它检索拒绝访问。 但是没有防病毒或任何其他进程阻止文件。 – KingOfMazes

+1

@KingOfMazes该文件可能是只读的,尝试将文件属性设置为正常,如File.SetAttributes(fileName,FileAttributes.Normal); –