Зачем вообще использовать папку% TEMP% теперь, когда Storage Sense может очистить ее в любое время?

Начиная с Windows 10, Storage Sense позволяет пользователям указывать %TEMP% очистку папки, которая выполняется не реже одного раза в день. Технически он может запускаться даже чаще, если он настроен для активации при нехватке места на диске, в зависимости от модели использования диска.

В свете этого, в чем смысл папки %TEMP%? Как я могу использовать папку, в которой каждый файл, который я помещаю туда, технически может быть удален системой сразу после того, как я закончу его писать?

Вот реальный сценарий, в котором меня это поразило (код упрощен для краткости):

var ffmpegPath = Path.Combine(Path.GetTempPath(), "ffmpeg");
DownloadFfmpeg(path: ffmpegPath); 

foreach (var videoFile in videoFiles) { //suppose there are dozens of files to process
   DoSomeHeavyProcessing(ffmpegPath);   //suppose each file takes an hour to process
}

Это отлично работало в течение первых нескольких часов, но затем в какой-то произвольный момент времени загруженная папка ffmpeg была удалена, и все последующие файлы не могли быть обработаны. На самом деле, если я правильно понимаю, теоретически даже такой код может выйти из строя:

var path = Path.Combine(Path.GetTempPath(), "foo");
File.WriteAllText(path, "bar");
Console.WriteLine(File.ReadAllText(path));

Теперь я знаю, как решить эту проблему - просто используйте %APPDATA%, %LOCALAPPDATA% или %PROGRAMDATA%. Но в том-то и дело - с момента появления Storage Sense, зачем мне использовать %TEMP% вместо прежних папок?


person Ohad Schneider    schedule 11.09.2020    source источник


Ответы (1)


Папка %TEMP% предназначена - как следует из названия - для временных файлов, которые необходимы только на (обычно короткий) период времени и впоследствии могут быть удалены. В идеальном мире каждое приложение, записывающее во временную папку, впоследствии очищало бы и удаляло созданные временные файлы, когда они больше не нужны. Но этого не происходит, поэтому %TEMP% папки имеют тенденцию становиться огромными.

Вы можете легко запретить Storage Sense удалять файлы, которые вам все еще нужны, установив для них файловую блокировку. Пока файл в папке %TEMP% используется, он не будет удален. После завершения обработки файла вы можете снять блокировку файла, что означает, что он вам больше не понадобится, и его можно будет удалить при следующем запуске Storage Sense.

Это имеет то преимущество, что вашему приложению больше не нужно убирать беспорядок (то есть временные файлы). Просто пусть приложение блокирует их, пока они нужны. После снятия блокировки (или выхода приложения, что также снимает блокировки файлов), они автоматически удаляются системой.

person derpirscher    schedule 11.09.2020
comment
Проголосовали за, но у меня есть несколько оговорок: (1) Технически файл может быть удален до того, как мне удастся установить блокировку (2) По какой-то причине у меня может не быть разрешений на блокировку файлов (3) По общему признанию, последние 2 вряд ли произойдут но чем больше файлов я загружаю, тем выше вероятность (например, в приведенном выше примере ffmpeg может быть много dll) (4) Я не смогу заблокировать файлы, поскольку я бы хотел, чтобы другие программы использовали их (например, я блокирую некоторые ffmpeg config и ffmpeg не запускается из-за этого) - да, я мог разблокировать и повторно блокировать каждый раз, но это больше хлопот и больше возможностей для исключений - person Ohad Schneider; 12.09.2020
comment
Кроме того, не гарантируется, что Storage Sense вообще будет работать (возможно, пользователь отключил его, на самом деле я думаю, что он отключен по умолчанию). И даже когда это произойдет, не гарантируется, когда и когда мои файлы будут удалены. Так что на практике кажется, что я беру на себя все обязанности по очистке, в то время как мне нужно подготовиться и написать код для всех потенциальных ловушек автоматической очистки. Честно говоря, просто сохранить что-то вроде %APPDATA% с finally блоком, который очищается после (или даже FileOptions.DeleteOnClose, если я действительно хочу быть хорошим самаритянином), кажется намного проще. - person Ohad Schneider; 12.09.2020
comment
Ваша аргументация основана на поведении, связанном с нехваткой места на диске. Когда это укусит вас в течение нескольких секунд после создания файла, ваша система в любом случае окажется в серьезной проблеме. В такой критической ситуации нельзя ни на что рассчитывать. С другой стороны, если вы вовремя отреагируете, например когда дисковое пространство становится меньше 5%, тогда все в порядке. - person user829755; 26.10.2020