Directory.Delete (путь, истина) файл используется другим процессом - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть функция, которая должна проверять файлы каталога, и если он находит файл с определенным именем, он должен удалить каталог (вроде как очистка)

public static void consumeFolderFiles(string path) 
{
    // get directory info
    DirectoryInfo info = new DirectoryInfo(path);

    // I want the files to be in order because I am planning to send them via FTP in order in the future.
    FileInfo[] files = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();
    bool success = false;

    if (files.Length > 0) 
    {
        // FTP logic (not implemented yet)
        // Check if there's a file's name that contains "balance"
        success = files.FirstOrDefault(f => f.Name.ToLower().Contains("balance")) != null;

        // Check if it's time to delete the directory 
        if (success) 
        {
            Directory.Delete(path, true);
        }
    }
    else 
    {
        // Custom exception 
        throw new NoNewTransactionsInFolderException();
    }
}

Эта функция, кажется,работает, но иногда я получаю исключение "процесс не может получить доступ к файлу ****. ***, потому что он используется другим процессом". Также я заметил, что все файлы до исключения были удалены нормально.

Функция выдает исключение непоследовательно.Это означает, что он может удалить папку или остановиться где-то посередине.Таким образом, я не думаю, что забыл закрыть ресурс или обработчик.

Я думаю, что это хорошая идея, чтобы включить функцию создания файла.Я мог что-то там пропустить.

public static void createXMLFile(object o, string path, string fileName) 
{
    XmlSerializer xml = new XmlSerializer(o.GetType());

    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    XmlTextWriter xtw = new XmlTextWriter(Path.Combine(path, fileName), Encoding.UTF8);
    xtw.Formatting = Formatting.Indented;

    xml.Serialize(xtw, o, ns);

    xtw.Close();
    xtw.Dispose();
}

Я видел другие ответы, где люди предлагали добавить try catch и вызвать Directory.Delete (path, true) в предложении catch или использовать .NET Transactional File Manager.Тем не менее, я хотел бы знать причину этого исключения.Это я что-то не так делаю или ошибка ОС?

...