Имя: Пароль:
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, если это потребуется.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn