Имя: Пароль:
1C
1С v8
Почему 1С не использует FILE_FLAG_DELETE_ON_CLOSE для временных файлов
0 MM
 
21.02.14
11:52
При работе с временными файлами 1С использует флаг FILE_ATTRIBUTE_TEMPORARY в функции CreateFile, но не использует FILE_FLAG_DELETE_ON_CLOSE. Не смотря, на рекомендации http://msdn.microsoft.com/en-us/library/cc500400.aspx, которые могли бы улучшить скорость работы с кешами. Знает ли кто почему?
1 Золотник
 
21.02.14
11:53
В 1с программисты умнее, чем в какой то мелкомягкой шарашке.
2 Asmody
 
21.02.14
11:53
(0) на Селезнёвской был, спрашивал?
3 MM
 
21.02.14
11:55
(2) Я вначале сюда. )
Думаю стоит ли исправлять внешней компонентой?
4 Speshuric
 
21.02.14
13:04
(3) А как это исправить внешней компонентой? Ну, ок, оказались мы даже внутри процесса 1С (клиент или сервер, кстати?). Как найти все открытые файлы и поменять режим открытия? Как различить из временных файлов не будут закрываться-открываться, а будут только закрываться? Как будет отрабатывать команда удаления, если она применялась (некоторые файлы точно видел, потом удаляются тем же сеансом)?

Надо, кстати, попробовать померять/сравнить применительно к 1С виндовое поведение и tempfs линуха.
5 MM
 
21.02.14
14:57
Сплайсингом API для core82.dll или лучше изменением таблиц импорта. Пока смотрел клиент, но длл похоже общая.
Что делать с временными файлами, которые повторно открываются ничего предложить не могу.
Возможно, что 1С правильно обрабатывает ошибку удаления файла которого нет. По-крайней мере, 1С свои временные файлы вначале пытается открыть с усечением, и при ошибке создаёт новый.
6 Torquader
 
21.02.14
15:00
На самом деле, если в файле предполагается что-то сохранить, то DELETE_ON_CLOSE тут ни к месту, так как закрыв дескриптор, мы просто теряем файл.
Кроме того, не факт, что такой файл увидят другие процессы или потоки по имени (им придётся передавать через CopyHanlde).
С другой стороны - зачем вообще нужны временные файлы, которые после закрытия сразу удаляются - только для расширения памяти - а тогда файл может быть всего один, а не "загадить всё что можно".
7 MM
 
21.02.14
15:27
(6) если данные маленькие или ОЗУ много, то всё добро хранится в памяти, это обычно так, если глядеть на tmp-файлы. Если же надо обработать, что-то большое, такой унифицированный подход позволяет занимать хоть весь винчестер.
Когда данные планируется сохранить на диск, то устанавливать FILE_ATTRIBUTE_TEMPORARY тоже не стоит.
8 Speshuric
 
21.02.14
15:37
(5) то есть подмена dll, а не внешняя компонента?
9 MM
 
21.02.14
15:40
(8) Нет, сплайсинг использует компонента Romixa. Но он не потокобезопасен.
10 MM
 
25.02.14
18:53
Никто не знает?
11 Torquader
 
25.02.14
23:54
В документации ещё написано, что открыть ещё раз файл с флагом DELETE_ON_CLOSE можно только если установлен режим FILE_SHARE_DELETE, что предполагает удаление файла в процессе работы.
P.S. проще чистить директорию временных файлов после закрытия 1С.
12 MM
 
26.02.14
11:43
(11) Эти флаги FILE_ATTRIBUTE_TEMPORARY и DELETE_ON_CLOSE на пару, подсказывают, что данные файла надо записывать на диск в последнюю очередь, что разгрузит винчестер.
FILE_SHARE_DELETE вроде нужен, если планируется повторное открытие файла, но можно воспользоваться DuplicateHandle, если это потребуется.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой