Имя: Пароль:
1C
1C 7.7
v7: Обработать текстовый файл без расширения "txt"
,
0 Venom
 
25.11.11
12:41
При открытии текстового файла без расширения "txt" выскакивает ошибка "Неверное имя файла!". С чем это связанно и как обойти эту проблему?

//======================================================================
Функция ПолучитьДанныеИзФайла(Файл,ИмяКаталога = КаталогСтатистики)
   
   Если ФС.СуществуетФайл(ИмяКаталога+Файл)=0 Тогда
       Сообщить("Внимание! Файла "+ИмяКаталога+Файл+" не существует.");
       Возврат "";
   КонецЕсли;
   
   Текст = СоздатьОбъект("Текст");
   Текст.Открыть(ИмяКаталога+Файл);
   
   КолВоСтр = Текст.КоличествоСтрок();
   Для СтрТ=1 По КолВоСтр Цикл
       Стр = Текст.ПолучитьСтроку(СтрТ);
       
       Сообщить(Стр);
   КонецЦикла;
   
   
   Возврат "";
КонецФункции // ПолучитьДанныеИзФайла
1 Mikeware
 
25.11.11
12:43
Текст.Открыть(ИмяКаталога+Файл+".");
2 zak555
 
25.11.11
12:44
(1) точка зачем ?
3 Venom
 
25.11.11
12:45
(1) точки тоже нет, файлы вида:
1
2
305
789632
4 Escander
 
25.11.11
12:45
(0) Сделай вывод ИмяКаталога+Файл - а то хз что туда пихаешь
5 Venom
 
25.11.11
12:46
Файлов очень много, более 3'000'000
6 Venom
 
25.11.11
12:47
(4) Пихается туда всё правильно, перепроверял много раз.
7 ptiz
 
25.11.11
12:47
База СМС? :)
8 Venom
 
25.11.11
12:47
+(6) ФС.СуществуетФайл(ИмяКаталога+Файл) не ругается
9 Venom
 
25.11.11
12:49
Если файл переименовать - добавив расширение .txt - то файл нормально читается
10 Escander
 
25.11.11
12:51
(9) а нутро файло точно текст? Нет всяких управляющих символов?
11 Venom
 
25.11.11
12:52
(10) точно текст
12 Escander
 
25.11.11
12:54
(11) с файловой системой точно всё норм? Кем-то открыт файл в этот момент точно не был?
13 aka AMIGO
 
25.11.11
12:54
скопируй куда-нибудь свой файл, присвой расширение тхт, наслаждайся
14 Escander
 
25.11.11
12:55
(13) ну как вариант через попытку, не прокатило в лоб - копия и профит!
15 aka AMIGO
 
25.11.11
12:55
а исходный не трожь..
16 Гость2
 
25.11.11
12:57
А расширение какое?
17 Venom
 
25.11.11
12:59
Расширения нет вовсе, и точки тоже нет
18 Гость2
 
25.11.11
13:03
В этом твои грабли. Дай любое расширение и будет работать
19 Venom
 
25.11.11
13:05
Добавить расширение это на крайний случай.
20 Гость2
 
25.11.11
13:07
Не и трахайся дальше   :-))
21 mishaPH
 
25.11.11
13:12
(19) почему? если определяется (8) то переименуй его и открывай. в чем проблема то
22 Venom
 
25.11.11
13:17
Файлов много. Ла так и сделаю, думал может хитрость какая есть
23 FN
 
25.11.11
13:18
fso=СоздатьОбъект("Scripting.FileSystemObject");
   ссылкаНаФайл=fso.GetFile(ИмяКаталога+Файл);
   РазмерФайла=ссылкаНаФайл.Size;
   текФайл=ссылкаНаФайл.OpenAsTextStream(1);
   Пока текФайл.AtEndOfStream=0 Цикл
       ТекСтрока=текФайл.ReadLine();
       Сообщить(ТекСтрока);
       
   КонецЦикла;
24 kuromanlich
 
25.11.11
13:19
(23) жесто )
25 Ткачев
 
25.11.11
13:19
ИмяКаталога = "D:\";
   Файл = "Help";
   Если ФС.СуществуетФайл(ИмяКаталога+Файл)=0 Тогда
       Сообщить("Внимание! Файла "+ИмяКаталога+Файл+" не существует.");
       Возврат;
   КонецЕсли;
   
   ЗагрузитьВнешнююКомпоненту("V7Plus.dll");
   Текст = СоздатьОбъект("addIN.V7TextFile");
   Текст.ОткрытьФайл(ИмяКаталога + Файл);
   
     Текст.ВыбратьСтроки();
     Стр="";
   Пока Текст.ПрочитатьСтроку(Стр) = 1 Цикл
       Сообщить(Стр);
   КонецЦикла;
26 FN
 
25.11.11
13:20
(24) получше чем (0)
27 Venom
 
25.11.11
13:25
(23) (25) Спасибо
28 Escander
 
25.11.11
13:26
(27) кста и потом отпишись какой способ быстрее и какой выстреливает лучше (без ошибок)
29 Venom
 
25.11.11
13:29
(28) Хорошо
30 mishaPH
 
25.11.11
13:31
(22) да ты больше времени потратишь на выяснение что и как чем прибавит к тормозам эта операция
31 Venom
 
25.11.11
13:31
+(29) Может ещё сделаю замер с переименованием файлов и Текст = СоздатьОбъект("Текст");
32 Ткачев
 
25.11.11
13:33
(28)Тогда ЗагрузитьВнешнююКомпоненту("V7Plus.dll") ПриЗапускеСистемы
а Текст = СоздатьОбъект("addIN.V7TextFile"); ПриОткрытии с Перем Текст;
33 Venom
 
25.11.11
13:34
(30) у меня "не горит", я делаю с учётом обработки файлов не только сейчас, но и в будущем (когда появятся новые файлы).
34 Escander
 
25.11.11
13:43
(31)ок, только не забудь
35 FN
 
25.11.11
13:58
(28) а че там мерять? V7TextFile - самый тормозной
Текст и FSO примерно одинаково, но на больших файлах Текст сдохнет, а FSO на размер плевать.
36 Venom
 
25.11.11
14:06
Могу на вскидку сказать, что FSO зверь. Буду теперь пользоваться им. Спасибо FN
37 FN
 
25.11.11
14:13
(36) на мелких файлах Текст может быть и быстрее, так как сразу весь файл в память грузит.
38 Venom
 
25.11.11
14:46
Замеры произвёл. При замере обрабатывал 200 файлов (файлы размером от 300 до 45000 байт)
1 способ используя СоздатьОбъект("Текст") с переименованием файла
2 способ используя СоздатьОбъект("Scripting.FileSystemObject")
3 способ используя СоздатьОбъект("addIN.V7TextFile")

Результаты:
1 - 214,854892 (из них 0,231959 на переименование)
2 - 184,911083
3 - 121,988587
39 Venom
 
25.11.11
14:47
//======================================================================
Процедура ОбработатьФайлСпособ1(Файл)
   НовНазв = Файл+".txt";
   ФС.ПереименоватьФайл(Файл,НовНазв,1);
   Файл = НовНазв;
   
   Текст1.Открыть(ИмяКаталога+Файл);
   КолВоСтр = Текст1.КоличествоСтрок();
   Для СтрТ=1 По КолВоСтр Цикл
       ТекСтрока = Текст1.ПолучитьСтроку(СтрТ);
       Сообщить(ТекСтрока);
   КонецЦикла;
КонецПроцедуры // ОбработатьФайлСпособ1

//======================================================================
Процедура ОбработатьФайлСпособ2(Файл)
   fso=СоздатьОбъект("Scripting.FileSystemObject");
   ссылкаНаФайл=fso.GetFile(ИмяКаталога+Файл);
   РазмерФайла=ссылкаНаФайл.Size;
   текФайл=ссылкаНаФайл.OpenAsTextStream(1);
   Пока текФайл.AtEndOfStream=0 Цикл
       ТекСтрока=текФайл.ReadLine();
       Сообщить(ТекСтрока);        
   КонецЦикла;
КонецПроцедуры // ОбработатьФайлСпособ2

//======================================================================
Процедура ОбработатьФайлСпособ3(Файл)
   Текст2.ОткрытьФайл(ИмяКаталога + Файл);    
   Текст2.ВыбратьСтроки();
   ТекСтрока="";
   Пока Текст2.ПрочитатьСтроку(ТекСтрока) = 1 Цикл
       Сообщить(ТекСтрока);
   КонецЦикла;
КонецПроцедуры // ОбработатьФайлСпособ3
40 Ткачев
 
25.11.11
14:55
(38)Я проиграл ?
41 Venom
 
25.11.11
14:59
(40) нет, наоборот
42 FN
 
25.11.11
15:04
(39) СоздатьОбъект("Scripting.FileSystemObject"); - нафига в цикле?

РазмерФайла=ссылкаНаФайл.Size; - это тоже лишнее для теста
43 Venom
 
25.11.11
15:07
(42) хорошо, я подозревал об этом., сейчас замерю заново
44 FN
 
25.11.11
15:09
и для чистоты эксперимента убери Сообщить() - а то оно жрет наверное 99% времени
45 Venom
 
25.11.11
15:14
Перезамерил 2 способ (изменив по совету из (42))
1 способ используя СоздатьОбъект("Текст") с переименованием файла
2 способ используя СоздатьОбъект("Scripting.FileSystemObject")
3 способ используя СоздатьОбъект("addIN.V7TextFile")

Результаты:
1 - 214,854892 (из них 0,231959 на переименование)
2 -  43,552677
3 - 121,988587

На Сообщить() во всех замерах уходит - 0,000151
46 1Сергей
 
25.11.11
15:14
(45) а с чего вдруг второй способ так сильно ускорился?
47 FN
 
25.11.11
15:23
(46) все правильно
48 Venom
 
25.11.11
15:23
(46) Действительно что-то неправильно. Попозже переделаю все замеры.
49 Venom
 
25.11.11
16:08
Убрал Сообщить(), результаты значительно изменились.

1 способ используя СоздатьОбъект("Текст") с переименованием файла
2 способ используя СоздатьОбъект("Scripting.FileSystemObject")
3 способ используя СоздатьОбъект("addIN.V7TextFile")

Замер проводился по 3 раза, в результат идёт среднее значение.
Результаты:

1 0,761471
2 0,525824
3 1,537899
50 Venom
 
25.11.11
16:11
//======================================================================
Процедура ОбработатьФайлСпособ1(Файл)
   НовНазв = Файл+".txt";
   ФС.ПереименоватьФайл(Файл,НовНазв,1);
   Файл = НовНазв;
   
   Текст1.Открыть(ИмяКаталога+Файл);
   КолВоСтр = Текст1.КоличествоСтрок();
   Для СтрТ=1 По КолВоСтр Цикл
       ТекСтрока = Текст1.ПолучитьСтроку(СтрТ);
       //Сообщить(ТекСтрока);
   КонецЦикла;
КонецПроцедуры // ОбработатьФайлСпособ1

//======================================================================
Процедура ОбработатьФайлСпособ2(Файл)
   //fso=СоздатьОбъект("Scripting.FileSystemObject");    
   ссылкаНаФайл=fso.GetFile(ИмяКаталога+Файл);
   //РазмерФайла=ссылкаНаФайл.Size;
   текФайл=ссылкаНаФайл.OpenAsTextStream(1);
   Пока текФайл.AtEndOfStream=0 Цикл
       ТекСтрока=текФайл.ReadLine();
       //Сообщить(ТекСтрока);        
   КонецЦикла;
КонецПроцедуры // ОбработатьФайлСпособ2

//======================================================================
Процедура ОбработатьФайлСпособ3(Файл)
   Текст2.ОткрытьФайл(ИмяКаталога + Файл);    
   Текст2.ВыбратьСтроки();
   ТекСтрока="";
   Пока Текст2.ПрочитатьСтроку(ТекСтрока) = 1 Цикл
       //Сообщить(ТекСтрока);
   КонецЦикла;
КонецПроцедуры // ОбработатьФайлСпособ3
51 FN
 
25.11.11
16:38
(49) :)
О чем собственно я и писал еще в (35)
52 Escander
 
25.11.11
16:56
(49)Оч хор! Буду иметь в виду!

Для эксперимента использовались независимые ныборы файлов? Имхо, после первого чтения файлы могут отстаться в кэше
53 Venom
 
05.12.11
12:29
К вышеупомянутым способам/тестам обработки текстовых файлов добавлю, что у ФСО есть ещё один огромный плюс - "Не забивается оперативная память". Т.е. процесс не доходит до критического значения, после которого выскакивает ошибка с недостатком памяти.

Итак, плюсы использования fso=СоздатьОбъект("Scripting.FileSystemObject");
1. Высокая скорость чтения текстовых файлов
2. Чтение файлов без зависимости от его расширения
3. Не съедает оперативную память
54 Ткачев
 
06.12.11
07:55
одынэска как всегда проиграла
55 1Сергей
 
06.12.11
08:15
(54) конечно. Ассемблер рулит. надо на нём БД делать