Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Вниз

как проверить что файл текстовый?   Найти похожие ветки 

 
tytus   (2006-05-12 13:51) [0]

Доброго дня ВСЕМ! Мне нужно в программе проверять, правильно ли пользователь выбрал файл - должен быть текстовый. Делаю так:
function TMainFm.CheckFileValid(AFileName:string):boolean;
var
 CData:PByte;
 CHandle,CType,CFileSize,CMapHandle:Cardinal;
 CFileInfo:BY_HANDLE_FILE_INFORMATION;
 Count,CharCount:integer;
begin
CHandle:=CreateFile(PChar(AFileName),GENERIC_READ,
     0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if CHandle=0 then
 begin
   MessageBox(Handle,"Error",PChar("Failed to open file"+#13+#10+
   AFileName),MB_OK);
   RaiseLastOsError;
   exit;
 end;
GetFileInformationByHandle(CHandle,CFileInfo);
CFileSize:=CFileInfo.nFileSizeLow+CFileInfo.nFileSizeHigh;
Count:=0;
CharCount:=0;
CMapHandle:=CreateFileMapping(CHandle,nil,PAGE_READONLY,0,CFileSize,nil);
CData:=MapViewOfFile(CMapHandle,FILE_MAP_READ,0,0,CFileSize);
while Count<CFileSize do
 begin
   if (CData^>31)or(CData^ in[$0D,$0A]) then inc(CharCount);
   inc(CData);
   inc(Count);
 end;
Result:=Count=CharCount;
UnMapViewOfFile(CData);
CloseHandle(CMapHandle);
CloseHandle(CHandle);
end;
Может есть способ по проще?


 
Сергей М. ©   (2006-05-12 13:57) [1]


> CFileSize:=CFileInfo.nFileSizeLow+CFileInfo.nFileSizeHigh


Это даст ошибку для любого файла размером более 65535 байт.

Читай справку и думай.


 
Jeer ©   (2006-05-12 13:57) [2]

Текстовый файл из одной строки без CRLF -  тоже текстовый.


 
Сергей М. ©   (2006-05-12 13:58) [3]

+ файл в формате Unicode - тоже текстовый


 
begin...end ©   (2006-05-12 14:05) [4]

> Сергей М. ©   (12.05.06 13:57) [1]

4294967295


 
tytus   (2006-05-12 14:06) [5]

>Сергей М [1]
Ничего попдобного. Делаю так уже давно, файлы открываются ЛЮБОГО размера!!!


 
balepa ©   (2006-05-12 14:07) [6]

А может просто давать открывать только .txt ?


 
tytus   (2006-05-12 14:08) [7]

Ну так что, НЕТУ варианта по проще и достовернее!?
и ище - [1] файл размером около 140 метров проверяется МГНОВЕННОООО!


 
tytus   (2006-05-12 14:11) [8]

>balera [6]
файл может иметь ЛЮБОЕ расширение (*.trf, *.bin etc), главное чтобы его содержимое можно было просмотреть БЛОКНОТОМ или ВОРДПАДОМ.


 
Сергей М. ©   (2006-05-12 14:14) [9]

Ничего не знаю.

Цитата из MSDN:

nFileSizeHigh

Specifies the high-order word of the file size.


Нет никаких сведений о сдвиге этого самого high-order word в поле nFileSizeHigh на 16 разрядов влево


 
begin...end ©   (2006-05-12 14:18) [10]

> Сергей М. ©   (12.05.06 14:14) [9]

У Вас неправильный MSDN.

nFileSizeHigh
 High-order part of the file size.
nFileSizeLow
 Low-order part of the file size.


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/by_handle_file_information_str.asp


 
Jeer ©   (2006-05-12 14:18) [11]

tytus   (12.05.06 14:11) [8]

А ты попробуй открыть в notepad не текстовый файл и удивишься - откроется.


 
tytus   (2006-05-12 14:18) [12]

>[9]
Проще всего отмахаться и не проверить!!! Я поражаюсь твоей ленью!
Код в начале ветки - скопируй (даже набирать ничего не надо !!!) и проверь!
Ежели не интересно - тогда другое дело, я бы на твоем месте разобрался...


 
Сергей М. ©   (2006-05-12 14:20) [13]


> begin...end ©   (12.05.06 14:18) [10]


Точно такой же как у тебя.

И где там сказано про сдвиг ?


 
begin...end ©   (2006-05-12 14:21) [14]

> Сергей М. ©   (12.05.06 14:20) [13]

> Точно такой же как у тебя.
Судя по различию текстов, не такой же.

> И где там сказано про сдвиг ?
Нигде. А про какой сдвиг там должно быть сказано?


 
tytus   (2006-05-12 14:21) [15]

>Jeer [11]
Да... удивил -)))) спасибо за совет -))))
Блокнотом можно и MP3 ( да что там - VOB) просматривать!!!
Господа, спасибо всем за внимание, но МЫ НЕмного отвлеклись...


 
Сергей М. ©   (2006-05-12 14:22) [16]


> tytus   (12.05.06 14:18) [12]


> не интересно - тогда другое дело


Действительно не интересно.

Был бы у тебя OR вместо "+" , я бы даже не обратил на это внимания.


 
Пусик ©   (2006-05-12 14:23) [17]


> Сергей М. ©   (12.05.06 13:57) [1]
>
>
> > CFileSize:=CFileInfo.nFileSizeLow+CFileInfo.nFileSizeHigh
>
>
> Это даст ошибку для любого файла размером более 65535 байт.
>


Для файлов больше 2-х Гигабайт.
> tytus   (12.05.06 14:08) [7]
>
> Ну так что, НЕТУ варианта по проще и достовернее!?


У тебя достаточно оптимальный код.
Но алгоритм проверки на текст немного неверный.

Кроме #13#10 практически в любом текстовм файл встретишь #09 - TAB.
Для определения, текстовый файл или нет, не обязательно проверять весь файл.
Для того, чтобы файл был тектовым, не нужно условие, чтобы все 100% файла были отображаемыми символами. Сколько в процентном соотношении тебя устроит - определи сам, тестируя на разных файлах.

Кроме того:

CFileSize: int64;

CFileSize:=CFileInfo.nFileSizeLow+(Int64(CFileInfo.nFileSizeHigh) shl 32);


 
Jeer ©   (2006-05-12 14:24) [18]

tytus   (12.05.06 14:21) [15]

Да какая разница - работает и ладно.
Вот если бы не работало.


 
tytus   (2006-05-12 14:28) [19]

>[17]
Да, Пусик, полностью  стобой согласен.
Просто в требуемых для обработки файлах ТОЧНО не встретится символ
табуляции - это 100 проц.
Кроме того, файлы 100 проц. текстовые, и соотношение мне ненужно, в этом скорее всего даже выгода есть определенная.


 
Сергей М. ©   (2006-05-12 14:29) [20]


> begin...end ©   (12.05.06 14:21) [14]
> Судя по различию текстов, не такой же.


Справка от Борланда в этом контексте смыслом не отличается, согласен ?


> ро какой сдвиг там должно быть сказано?


Про тот самый ..

Для файла размером, скажем, 70000 байт значение High-order part должно быть равно $00000001, а не $00010000


 
tytus   (2006-05-12 14:30) [21]

>ALL. спасибо ВСЕМ, кто был неравнодушен к моему вопросу!
Если что - пишите.


 
atruhin ©   (2006-05-12 14:31) [22]

Абсолютно ненужная проверка! Если бы это можно было достоверно проверить.... :). Например файл в дос кодировке с таблицами в псевдографике, может использовать почти все 256 сиволов.


 
Jeer ©   (2006-05-12 14:31) [23]

Пробный текстовый файл ?  :))


 
begin...end ©   (2006-05-12 14:36) [24]

> Пусик ©   (12.05.06 14:23) [17]

Лучше так:

Int64Rec(CFileSize).Lo := CFileInfo.nFileSizeLow;
Int64Rec(CFileSize).Hi := CFileInfo.nFileSizeHigh;

> Сергей М. ©   (12.05.06 14:29) [20]

> Справка от Борланда в этом контексте смыслом не отличается,
> согласен ?

Как же не отличается? В ней говорится про low/high-order word, а в MSDN -- про low/high-order part. И если 32-битный параметр называется младшей ЧАСТЬЮ размера файла, то я не вижу причин для того, чтобы считать действительными только 16 бит.

> Для файла размером, скажем, 70000 байт значение High-order
> part должно быть равно $00000001, а не $00010000

Для файла размером в 70000 байт значение high-order part должно быть равно нулю.


 
Сергей М. ©   (2006-05-12 14:38) [25]


> Пусик ©   (12.05.06 14:23) [17]


> Для файлов больше 2-х Гигабайт


При Int64 это будет всего лишь "ругань" компилятора, не более того.


 
tytus   (2006-05-12 14:40) [26]

>atruhin [22]
Псевдографика - это ///\\\|||||----____, дык проверяется ...
>jeer [23] ВОТ ОНО:
06-05-0900:151    481 139113496874   60    0    0       0000000000002 1391       0    0    0    0       0000000000003 1391       0    4    4    0       0000000000004 1391       0    0    0    0       4000000000005 1391       0  120    0    0       0000000000006 1391       0    0    0    0       0000000000007 1391     189    4    0    4       001600000000
06-05-0900:301    481 139113497209   60    0    0       0000000000002 1391       0    0    0    0       0000000000003 1391       0   18   18    0       0000000000004 1391       0    0    0    0      18000000000005 1391       0  121    0    0       0000000000006 1391       0    0    0    0       0000000000007 1391     235   18    0   18       001600000000 И ТАК ДАЛЕЕ - около 34 кило.
Открыто супер просмотрщиком файлов - БЛОКНОТ-ом!


 
Сергей М. ©   (2006-05-12 14:46) [27]


> Для файла размером в 70000 байт значение high-order part
> должно быть равно нулю


Согласен.
Меня почему-то заклинило на различиях FAT32, где размер файла не может превышать 4ГБ, и, скажем, NTFS, где нет это ограничение отсутствует.

Тем не менее сложение nFileSizeLow nFileSizeHigh бессмысленно для общего случая, при котором размер файла может превышать 4Гб.


 
Игорь Шевченко ©   (2006-05-12 14:49) [28]


> Кроме #13#10 практически в любом текстовм файл встретишь
> #09 - TAB.


Это вряд ли


 
Мефисто   (2006-05-12 21:15) [29]

tytus    (12.05.06 14:30) [21]

Автар не страдайте ерундой.
#13#10
# 09
Могут и в экзешнике попасться без проблем. Без проблем в экзешнике можно и некую текстовую строчку отыскать :)
В данном контексте достоверно проверить является файл текстовым или нет НЕ ВОЗМОЖНО. Воспользоваться вам нужно советом выше. Открывать только файлы с типичным расширением для текстовых файлов. А уж если какойнить изврашенец My.DLL переименовал My.TXT, то уж извеняйте... Программа не телепат...


 
Fay ©   (2006-05-13 12:38) [30]

> if CHandle=0 then
Это чё за хрень? Сравнивать нужно с INVALID_HANDLE_VALUE


 
Eraser ©   (2006-05-13 13:56) [31]


> как проверить что файл текстовый?

по расширению.


 
isasa ©   (2006-05-13 15:59) [32]

По поводу ДОС файлов, в текстовом, может быть и $1A(^Z) и PageBreak, и много чего.
Что считать текстовым файлом(не текстом, как таковым)?


 
isasa ©   (2006-05-13 16:03) [33]

tytus   (12.05.06 14:40) [26]
Я бы проверил на наличие адекватных позиций в колонках, или наличие правильного(одно количества в строке) разделителей.
А файл, не текстовый, а "плоский"(flat в терминах MS SQL), т.е. *.CSV


 
Kolan ©   (2006-05-14 13:16) [34]

Доброго дня ВСЕМ! Мне нужно в программе проверять, правильно ли пользователь выбрал файл - должен быть текстовый. Делаю так:

Не проверяй. Делай то что тебе надо, если не получается(ошибка), то сообщай, что файл неверного формата.
Делается через простой
try
except
end;


 
Мефисто   (2006-05-14 18:42) [35]

Kolan  ©   (14.05.06 13:16) [34]

:)))

>> Делай то что тебе надо,

try
TopenDialog.FileName := "...\Word.exe";
...
>> если не получается(ошибка)
// А ведь может и получиться :)
TFileStream.WriteBlock(...);
...
except
>> то сообщай, что файл неверного формата.
// Толи файл не текстовый, толи открыт другим приложением,
// Толи руки кривые, толи лыжи не едут
end;

Причин ошибок может быть куча
>> то сообщай, что файл неверного формата
А заводить пользователя (и себя) в звблуждение не нужно. Ведь ошибки могут бить и при работе с текстовым файлом.

P.S. Нет уж, лучше по старинке оградить пользователя выбором файла определенного файла через TOpenDialog к примеру. А если уж пользователю так хочется любой фалй открыть, так и быть, в списке фильтра оставлю еще масочку типа: *.*


 
Kolan ©   (2006-05-14 19:13) [36]

Мефисто   (14.05.06 18:42) [35]
P.S. Нет уж, лучше по старинке оградить пользователя выбором файла определенного файла через TOpenDialog к примеру. А если уж пользователю так хочется любой фалй открыть, так и быть, в списке фильтра оставлю еще масочку типа: *.*

Так это понятно, тоже всегда так делаю.. А если например Drag"n"Drop.

Просто считаю, что считать символы и в процентах там что-то сравнивать вообше бред.

А в except, извесные типы ошибок. Можно по разному обработать. Ну и тд...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.01 c
3-1145957654
kyn66
2006-04-25 13:34
2006.06.18
SQL-запрос с параметрами выдает ошибки


3-1145887884
Квэнди
2006-04-24 18:11
2006.06.18
Dbexpress Delphi 2006


4-1142853676
KALqYAN
2006-03-20 14:21
2006.06.18
CPU Usage


2-1149135720
Laymer
2006-06-01 08:22
2006.06.18
Классы


15-1148280138
Denis
2006-05-22 10:42
2006.06.18
Программирование микроконтроллеров Atmel - AVR Assembler





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский