создание временного файла с использованием (FileStream) приводит к тому, что «процесс не может получить доступ к файлу, потому что он используется» - PullRequest
3 голосов
/ 08 декабря 2010

Я читаю файл с сервера SQL и временно записываю его на диск, чтобы другая программа могла получить к нему доступ.Довольно просто с Path.GetTempFileName ().

Моя проблема в том, что мне нужно удалить эти временные файлы после завершения процесса.Я делаю это с помощью класса FileStream, например:

using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write,    FileShare.None, 8, FileOptions.DeleteOnClose))
{  
  //code here ultimately accessing the temp file
}

При установленном fileOptions файл удаляется после завершения с использованием и удаления FileStream.Файл определенно создается и удаляется по команде, но любой процесс, обращающийся к файлу, отвечает «Процесс не может получить доступ к файлу, потому что он используется ...»

Понятно, если мой FileStreamвсе еще имеет доступ к файлу (я безуспешно пытался изменить FileShare; этот другой процесс не является файловым потоком.)

Я надеюсь избежать использования методов удаления (что потребует большего количества перехватов ошибок).Есть ли простой способ (используя FileStream) создать временный файл и удалить его после завершения другого процесса?

Ответы [ 3 ]

0 голосов
/ 08 декабря 2010

Я не вижу возможности здесь с помощью оператора using, но вы можете использовать метод Process.WaitForExit(), чтобы дождаться завершения другого процесса, после чего вы можете безопасно удалить файл.

0 голосов
/ 08 декабря 2010

Если вы работаете в ОС Windows, DeleteOnClose фактически поддерживается резервными копиями FILE_FLAG_DELETE_ON_CLOSE флагов, переданных в функцию CreateFile

Документация гласит: " Файл должен быть удален сразу после закрытия всех его дескрипторов, включая указанный дескриптор и любые другие открытые или дублированные дескрипторы ."

Так что вам нужно вызвать DuplicateHandle (doc здесь ) для свойства FileStream Handle или SafeFileHandle. Вы должны быть в состоянии сделать это в использовании. Вот одна возможность объявления DuplicateHandle в C #:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool DuplicateHandle(
    IntPtr hSourceProcess,
    SafeFileHandle hSourceHandle,
    IntPtr hTargetProcessHandle,
    out IntPtr hTargetHandle,
    uint dwDesiredAccess,
    bool fInheritHandle,
    uint dwOptions);

Я не проверял это, но у него хорошие шансы на работу: -)

0 голосов
/ 08 декабря 2010

Закрыть th fileStream с помощью метода Close () потока перед закрытием предложения using.

...