Создайте и откройте как доступную только для чтения временную копию существующего файла и удалите после использования - PullRequest
0 голосов
/ 01 мая 2020

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

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

Для этого я создал новый поток, который копирует файл во временный путь, задает атрибуты файлов, присоединяет обработчик Process к нему, а затем "ждет" и удаляет файл при выходе. Преимущество этого в том, что поток будет продолжать работать даже после выхода из программы (так или иначе кажется). Таким образом, файл все равно будет удален, даже если пользователь будет держать его открытым дольше, чем программа.

Вот мой код. Объект att содержит информацию о моем файле.

new Thread(() =>
{
      //Create the temp file name
      string temp = System.IO.Path.GetTempPath() + att.FileNameWithExtension;

      //Determine if this file already exists (in case it didn't delete)
      //This is important as setting it readonly will create User Access Control (UAC) issues for overwritting 
      //if the read only attribute exists
      if (File.Exists(temp)) { File.SetAttributes(temp, FileAttributes.Temporary ); }

      //Copy original file to temp location. Overwrite if it already exists due to previous deletion failure
      File.Copy(att.FullFileName, temp, true);

      //Set temp file attributes
      File.SetAttributes(temp, FileAttributes.Temporary | FileAttributes.ReadOnly);

      //Start process and monitor
      var p = Process.Start(temp);//Open attachment in default program
      if (p != null) { p.WaitForExit(); }

      //After process ends remove readonly attribute to allow deletion without causing UAC issues
      File.SetAttributes(temp, FileAttributes.Temporary);
      File.Delete(temp);
}
).Start();

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

Так что мой вопрос:

  1. Есть ли лучший способ добиться открытия только для чтения временной копии файла, который сначала не записывается на диск?
  2. Если нет, с какими последствиями я мог бы столкнуться, приняв многопоточный подход?

Любая информация приветствуется.

1 Ответ

1 голос
/ 01 мая 2020

Вместо удаления временных файлов при завершении работы удалите «оставшиеся» файлы при запуске.

Это часто проще реализовать, чем пытаться обеспечить выполнение такого кода очистки при завершении процесса и обрабатывает такие «принудительные» случаи, как сбой питания, «kill -9», «конец процесса» и т. д. c.

. Мне нравится создавать папку «temp» для таких файлов: все мои приложения сканируют и удалите любые файлы в такой папке при запуске, и код можно просто добавить в любой новый проект без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...