Я искал информацию, но я просто боюсь, что, возможно, у меня возникнут проблемы, так как я не опытен в многопоточности. У меня есть настольное приложение, которое должно создать временную копию существующего файла, доступную только для чтения, открыть файл в приложении по умолчанию и затем удалить файл, как только пользователь закончит его просмотр.
Он должен открыть чтение только пользователь может попытаться сохранить его, думая, что это оригинальный файл.
Для этого я создал новый поток, который копирует файл во временный путь, задает атрибуты файлов, присоединяет обработчик 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
.
Так что мой вопрос:
- Есть ли лучший способ добиться открытия только для чтения временной копии файла, который сначала не записывается на диск?
- Если нет, с какими последствиями я мог бы столкнуться, приняв многопоточный подход?
Любая информация приветствуется.