Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как проверить что файл текстовый? [D7, WinXP]


Страницы:   1 2

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 -  тоже текстовый.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо