Система .IO.DirectoryNotFoundException после удаления пустой папки и ее воссоздания

Я хочу скопировать папку, и я хочу сначала удалить папку назначения. Итак, я удаляю папку назначения, затем воссоздаю ее, а затем копирую файлы. Проблема в том, что я получаю Необработанное исключение типа «System.IO.DirectoryNotFoundException» в 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: \ Users \ joe \ Desktop \ 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);
    }.......

Таким образом, вы ждете с созданием, пока процесс удаления не завершится. Спасибо всем, и особенно Саиду.

15
задан xmedeko 17 July 2017 в 12:01
поделиться