-
Notifications
You must be signed in to change notification settings - Fork 6
/
ВременныеФайлы.os
209 lines (169 loc) · 9.55 KB
/
ВременныеФайлы.os
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
//////////////////////////////////////////////////////////////////
//
// Простой хелпер создания временных файлов и каталогов
//
//////////////////////////////////////////////////////////////////
#Использовать logos
Перем мВременныеФайлы;
Перем Лог;
Перем ЭтоWindows;
Перем БазовыйКаталог Экспорт;
/////////////////////////////////////////////////////////////////////////
// Программный интерфейс
// генерирует уникальное имя, по которому можно создать временный файл
//
// Параметры:
// Расширение - Строка - Расширение файла. По умолчанию "tmp"
//
// Возвращаемое значение:
// Строка - полный путь временного файла
//
Функция НовоеИмяФайла(Знач Расширение = "tmp") Экспорт
ИмяВремФайла = ПолучитьИмяВременногоФайла(Расширение);
Если ЗначениеЗаполнено(БазовыйКаталог) Тогда
Файл = Новый Файл(ИмяВремФайла);
ИмяВремФайла = ОбъединитьПути(БазовыйКаталог, Файл.Имя);
КонецЕсли;
мВременныеФайлы.Добавить(ИмяВремФайла);
Возврат ИмяВремФайла;
КонецФункции
// создает файл с расширением во временном каталоге системы
//
// Параметры:
// Расширение - Строка - Расширение файла. По умолчанию "tmp"
//
// Возвращаемое значение:
// Строка - полный путь созданного временного файла
//
Функция СоздатьФайл(Знач Расширение = "tmp") Экспорт
ИмяФайла = НовоеИмяФайла(Расширение);
Кодировка = ?(ЭтоWindows, КодировкаТекста.ANSI, "utf-8");
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, Кодировка);
ЗаписьТекста.Закрыть();
Возврат ИмяФайла;
КонецФункции
// создает каталог с расширением во временном каталоге системы
//
// Параметры:
// Расширение - Строка - Расширение файла. По умолчанию "tmp"
//
// Возвращаемое значение:
// Строка - полный путь созданного временного каталога
//
Функция СоздатьКаталог(Знач Расширение = "tmp") Экспорт
ИмяФайла = НовоеИмяФайла(Расширение);
СоздатьКаталог(ИмяФайла);
Возврат ИмяФайла;
КонецФункции
// удаляет все ранее созданные файлы и каталоги
//
Процедура Удалить() Экспорт
КрайнийИндекс = мВременныеФайлы.Количество()-1;
Для Сч = 0 По КрайнийИндекс Цикл
Индекс = КрайнийИндекс-Сч;
ИмяВременногоФайла = мВременныеФайлы[Индекс];
Если БезопасноУдалитьФайл(ИмяВременногоФайла) Тогда
мВременныеФайлы.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// удаляет указанный файл/каталог.
// Если у файла указан файловый атрибут "только для чтения", перед удалением происходит попытка снять этот атрибут.
//
// Параметры:
// Путь - Строка - путь файла
//
// Возвращаемое значение:
// Булево - удалось или не удалось удалить файл
//
Функция УдалитьФайл(Знач Путь) Экспорт
Возврат БезопасноУдалитьФайл(Путь);
КонецФункции
// удаляет указанный файл/каталог.
// Если у файла указан файловый атрибут "только для чтения", перед удалением происходит попытка снять этот атрибут.
//
// Параметры:
// Путь - Строка - путь файла
//
// Возвращаемое значение:
// Булево - удалось или не удалось удалить файл
//
Функция БезопасноУдалитьФайл(Знач Путь) Экспорт
Попытка
УдалитьФайлы(Путь);
Возврат Истина;
Исключение
Попытка
Для каждого Файл Из НайтиФайлы(Путь, ПолучитьМаскуВсеФайлы(), Истина) Цикл
Если Файл.ПолучитьТолькоЧтение() Тогда
Файл.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
КонецЦикла;
УдалитьФайлы(Путь);
Возврат Истина;
Исключение
ТекстОшибки = "Попытка удаления " + Путь + " закончилась неудачей, по причине " + ОписаниеОшибки();
Лог.Предупреждение(ТекстОшибки);
КонецПопытки;
КонецПопытки;
Возврат Ложь;
КонецФункции
// Массив накопленных путей временных файлов
//
// Возвращаемое значение:
// Массив - <описание возвращаемого значения>
//
Функция Файлы() Экспорт
Результат = Новый Массив;
Для каждого Путь Из мВременныеФайлы Цикл
Результат.Добавить(Путь);
КонецЦикла;
Возврат Результат;
КонецФункции
// Удалить все накопленные временные файлы, которые были добавлены после фиксации набора временных файлов.
// Удобно использовать для быстрой очистки на очередной итерации
// Предварительно нужно зафиксировать текущий набор временных файлов через Файлы()
// Алгоритм:
// ВременныеФайлыДо = ВременныеФайлы.Файлы();
// Попытка
// // основной код
// Исключение
// // обработка ошибок
// ВременныеФайлы.УдалитьНакопленныеВременныеФайлы(ВременныеФайлыДо);
// ВызватьИсключение;
// КонецПопытки;
// ВременныеФайлы.УдалитьНакопленныеВременныеФайлы(ВременныеФайлыДо);
//
// Параметры:
// ВременныеФайлыДо - Массив - набор ранее полученных временных файлов через Файлы()
//
Процедура УдалитьНакопленныеВременныеФайлы(Знач ВременныеФайлыДо) Экспорт
ВременныеФайлыПосле = Файлы();
ОтборФайлов = Новый Соответствие;
СкопироватьКоллекцию(ВременныеФайлыДо, ОтборФайлов);
КрайнийИндекс = ВременныеФайлыПосле.Количество()-1;
Для Сч = 0 По КрайнийИндекс Цикл
Индекс = КрайнийИндекс-Сч;
ИмяВременногоФайла = ВременныеФайлыПосле[Индекс];
Если ОтборФайлов.Получить(ИмяВременногоФайла) = Неопределено
И БезопасноУдалитьФайл(ИмяВременногоФайла) Тогда
ВременныеФайлыПосле.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Скопировать одну простую коллекцию (Массив) в другую (Структура, Соответствие)
// значение из источника становится и ключем, и значение приемника
//
// Параметры:
// Массив - Массив - <описание параметра>
// Приемник - Структура, Соответствие - <описание параметра>
//
Процедура СкопироватьКоллекцию(Массив, Приемник) Экспорт
Для каждого Значение Из Массив Цикл
Приемник.Вставить(Значение, Значение);
КонецЦикла;
КонецПроцедуры
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
мВременныеФайлы = Новый Массив;
Лог = Логирование.ПолучитьЛог("oscript.app.tempfiles");