2014-02-21 3 views
1

Я хотел бы использовать временный каталог, который будет автоматически удален после остановки приложения.Возможно ли иметь каталог, который существует только в том случае, когда приложение является живым?

Существует ли такой механизм в структуре, или я должен сам его запрограммировать?

Спасибо!

+0

Возможный дубликат [Создание временного каталога в Windows?] (Http: // stackoverflow.com/questions/278439/create-a-tempor-directory-in-windows) – Mithrandir

+0

Mithrandir, я не думаю, что это дубликат, я не спрашиваю, как создать временный каталог (который я могу сделать), но если существует встроенный метод привязки времени жизни каталога к времени жизни приложения. – Shimrod

+0

Вы всегда можете положить его на моно и использовать докер-контейнер. Это примерно так же временно, как и получается. –

ответ

3

Нет ничего встроенного, что сделает это. Вы можете создать папку при запуске и заблокировать файл, чтобы предотвратить ее удаление другим процессом, но я уверен, что это так.

Если важно, чтобы эта папка вообще не существовала, если приложение не запущено, вам понадобится служба, которая контролирует состояние приложения и папки. Таким образом, в случае сбоя приложения или перезагрузки компьютера вы будете (разумно) уверены, что папка недоступна ни по одному из этих сценариев. Конечно, вы захотите, чтобы ваш сервис запускался автоматически при загрузке.

1

Вы также должны иметь в виду, что приложение может быть прекращено необычным способом. Возможно, даже отключите компьютер. Таким образом, папка может уже существовать при перезапуске программы.

2

Нет встроенного метода для каталогов, насколько я знаю, но вы можете легко имитировать это поведение, создав одноразовый класс и конструкцию using, которая гарантирует, что папка будет удалена, даже если приложение неожиданно завершится :

public class TempFolder : IDisposable 
{ 
    public string RootPath { get; private set; } 

    public TempFolder() 
    { 
     RootPath = Path.GetTempPath(); 
    } 

    public void Dispose() 
    { 
     Directory.Delete(RootPath, true); 
    } 
} 

Затем в вашем приложении:

общественный статический класс MyApp {

public static void Main(string[] args) 
{ 
    using(var tempFolder = new TempFolder()) 
    { 

     // Do my stuff using tempFolder.RootPath as base path to create new files 
    } 

    // temporal directory will be deleted when we reach here 
    // even if an exception is thrown! :) 
} 

}

Обратите внимание, что это упрощенный подход; остерегайтесь заблокированных файлов внутри директории во времени, что может привести к Directory.Delete к сбою операции

Кроме того, некоторые в некоторых случаях метод Dispose нельзя было назвать:

  • Некоторые неуловимым исключения, как StackOverflowException и OutOfMemoryException
  • Исключено исключенное исключение в другой теме, порожденной вашей заявкой
  • Процесс убит

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

+1

При использовании этого следует помнить, что если программа существует непредвиденными способами (например, сбой), она не будет очищать каталог. Но это будет работать для типичных случаев. – LB2

+0

На самом деле это зависит от крушения приложения. Если авария вызвана исключенным исключением .NET (это обычный случай), метод dispose вызывается в любом случае: http://stackoverflow.com/questions/8309877/if-an-exception-happens-within-a- using-statement-does-the-object-still-get-dispo –

+1

Не для всех исключений. В StackOverflowException и OutOfMemoryException он не будет вызван. http://stackoverflow.com/questions/3304308/try-catch-finally-question – Crono

0

Windows API поддерживает файлы, которые должны быть созданы таким образом, чтобы при закрытии последнего дескриптора файла файл был удален. Однако я не уверен, что такой существует для каталога. Посмотрите на System.IO.File.CreateFile(); и FileOptions.DeleteOnClose для описания. Также обратите внимание на underlying Win32 API - возможно, вы можете приспособить его к вашим потребностям.