![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как проверить что файл текстовый? [D7, WinXP]
tytus © (2006-05-12 13:51:00)Доброго дня ВСЕМ! Мне нужно в программе проверять, правильно ли пользователь выбрал файл - должен быть текстовый. Делаю так:
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 14:22:00) [21]
> tytus (12.05.06 14:18) [12]
> не интересно - тогда другое дело
Действительно не интересно.
Был бы у тебя OR вместо "+" , я бы даже не обратил на это внимания.
tytus (2006-05-12 14:21:00) [22]>Jeer [11]
Да... удивил -)))) спасибо за совет -))))
Блокнотом можно и MP3 ( да что там - VOB) просматривать!!!
Господа, спасибо всем за внимание, но МЫ НЕмного отвлеклись...
begin...end (2006-05-12 14:21:00) [23]> Сергей М. © (12.05.06 14:20) [13]
> Точно такой же как у тебя.
Судя по различию текстов, не такой же.
> И где там сказано про сдвиг ?
Нигде. А про какой сдвиг там должно быть сказано?
Сергей М. (2006-05-12 14:20:00) [24]
> begin...end © (12.05.06 14:18) [10]
Точно такой же как у тебя.
И где там сказано про сдвиг ?
begin...end (2006-05-12 14:18:00) [25]> Сергей М. © (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:00) [26]tytus (12.05.06 14:11) [8]
А ты попробуй открыть в notepad не текстовый файл и удивишься - откроется.
tytus (2006-05-12 14:18:00) [27]>[9]
Проще всего отмахаться и не проверить!!! Я поражаюсь твоей ленью!
Код в начале ветки - скопируй (даже набирать ничего не надо !!!) и проверь!
Ежели не интересно - тогда другое дело, я бы на твоем месте разобрался...
Сергей М. (2006-05-12 14:14:00) [28]Ничего не знаю.
Цитата из MSDN:
nFileSizeHigh
Specifies the high-order word of the file size.
Нет никаких сведений о сдвиге этого самого high-order word в поле nFileSizeHigh на 16 разрядов влево
tytus (2006-05-12 14:11:00) [29]>balera [6]
файл может иметь ЛЮБОЕ расширение (*.trf, *.bin etc), главное чтобы его содержимое можно было просмотреть БЛОКНОТОМ или ВОРДПАДОМ.
tytus (2006-05-12 14:08:00) [30]Ну так что, НЕТУ варианта по проще и достовернее!?
и ище - [1] файл размером около 140 метров проверяется МГНОВЕННОООО!
balepa (2006-05-12 14:07:00) [31]А может просто давать открывать только .txt ?
tytus (2006-05-12 14:06:00) [32]>Сергей М [1]
Ничего попдобного. Делаю так уже давно, файлы открываются ЛЮБОГО размера!!!
begin...end (2006-05-12 14:05:00) [33]> Сергей М. © (12.05.06 13:57) [1]
4294967295
Сергей М. (2006-05-12 13:58:00) [34]+ файл в формате Unicode - тоже текстовый
Сергей М. (2006-05-12 13:57:00) [35]
> CFileSize:=CFileInfo.nFileSizeLow+CFileInfo.nFileSizeHigh
Этодаст ошибку для любого файла размером более 65535 байт.
Читай справку и думай.
Jeer (2006-05-12 13:57:00) [36]Текстовый файл из одной строки без CRLF - тоже текстовый.