![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FILE / FOLDER
serhiyiv © (2009-12-01 19:00:00)Народ привет. Подскажите пожалуйста как отличить файл от папки? Можно использовать if FolderExists но хотелось бы по другому. И вообще какая разница между ними? Как программисты придумали папки и ОС может их различать от файлов?
Sha (2009-12-03 09:08:00) [1]> Юрий Зотов © (03.12.09 00:17) [21]
Мы недавно искали ошибку в одном продукте. Работал почти на всех компьютерах, но на некоторых не хотел ни в какую. Причина в том же.
Как оказалось, на тех, что работал, служба индексирования никогда не запускалась.
Германн (2009-12-03 01:17:00) [2]
> serhiyiv © (02.12.09 12:55) [17]
>
>
> > Может лучше сначала почитать учебник? А потом "возникать"!
>
>
> Блин, так и думал что не правильно поймут... Просто писал
> я и не так как вы процетировали
Я ц Итировал не с потолка, а из твоего сообщения. Так что извини. Код приведенный в сообщении должен быть именно такой, какой ты используешь.
Юрий Зотов (2009-12-03 00:17:00) [3]Ох, помнится, и накололся же я однажды с этим недокументированным в моей локальной MSDN флагом FILE_ATTRIBUTE_NOT_CONTENT_INDEXED. Код, вроде бы, железно правильный, а работает неверно - и кто ж мог знать, что они туда еще флагов понапихали?
Sha (2009-12-02 13:50:00) [4]> Anatoly Podgoretsky © (02.12.09 13:38) [19]
> Уже давно методы работы с аттрибутами в Дельфи устарели,
Не совсем ясно, как можно было бы работать по-новому на базе все того же API.
Anatoly Podgoretsky (2009-12-02 13:38:00) [5]
> Sha © (02.12.09 10:09) [16]
Уже давно методы работы с аттрибутами в Дельфи устарели, но их так и не меняют, хотя достаточно было бы изменить маску faAnyFiles и константы флагов.
Игорь Шевченко (2009-12-02 13:14:00) [6]
> а из "учебника" пример использовал
выброси учебник
serhiyiv (2009-12-02 12:55:00) [7]
> Может лучше сначала почитать учебник? А потом "возникать"!
Блин, так и думал что не правильно поймут... Просто писал я и не так как вы процетировали, а из "учебника" пример использовал, но результат тотже. Вот по тому я и спрасил пробовали ли вы ето на практике или вы просто знаете что надо сделать именно так. А вобще БОЛЬШОЕ СПАСИБО за помощь, я ведь все таки в разделе для начинающих пишу...
Sha (2009-12-02 10:09:00) [8]С FindFirst/FindNext не все так очевидно, как может показаться на первый взгляд. В хелпе сказано: The Attr parameter specifies the special files to include in additionto all normal files. Т.е. невозможно выключить отбор нормальных файлов, можно лишь отобрать дополнительно к ним файлы, имеющие указанные атрибуты. Например, если файл имеет атрибутый скрытый и системный, а мы указали в условиях отбора только скрытый, то файл не будет отобран. Т.е. будут отобраны файлы, удовлетворяющие условию:
Attr and (not FindAttr) and faAnyFile = 0,
где Attr – атрибуты файла, FindAttr – параметр FindFirst.
Поэтому на практике часто в качестве FindAttr используют значение faAnyFile и прочитывают полностью весь каталог, а с каждой прочитанной записью разбираются отдельно, анализируя атрибуты файла. См. http://msdn.microsoft.com/en-us/library/cc232110(PROT.13).aspx
При этом тоже есть одна тонкость. Поле Attr записи TSearchRec имеет тип integer и может случиться, что оно имеет установленные биты за пределами первого байта, более строго:
Attr and (not faAnyFile)<>0.
Так, например, бывает когда выставлен бит FILE_ATTRIBUTE_NOT_CONTENT_INDEXED - 'содержимое файла не проиндексировано'. Поэтому если мы хотим проверить, относится ли полученная запись к каталогу, то нельзя это делать так:
if Attr=faDirectory
т.к. сюда, например, не войдут скрытые, системные и непроиндексированные каталоги,
более правильно проверять так:
if Attr and faDirectory<>0
Новичка поджидают еще не одни грабли. Пример в справке к Delphi 7 содержит 2 грубых ошибки:
1)
if CheckBox6.Checked thenвместо арифметических операторов при работе с атрибутами файла надо использовать логические, в частности, здесь плюс надо заменить на OR.
FileAttrs := FileAttrs + faArchive;
if CheckBox7.Checked then
FileAttrs := FileAttrs + faAnyFile;
2)
if (sr.Attr and FileAttrs) = sr.Attr then
Как мы знаем, содержимое файла могло быть не проиндексировано Windows, и в этом случае sr.Attr может иметь установленный бит FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, и, значит, условие отбора может не выполниться. Правильно было бы написать, например, так:
if (sr.Attr and FileAttrs) = (sr.Attr and faAnyFile) then
Anatoly Podgoretsky (2009-12-02 07:33:00) [9]> serhiyiv (02.12.2009 01:29:07) [7]
Ну проверили - работает!
Отсортировать faDirectory
Читай http://www.podgoretsky.com/Redir.aspx?id=137&DownloadFile=~/ddp/bits.aspx
SergP (2009-12-02 06:23:00) [10]
> то D:\BackUp - определяеться как папка (к стати это первая
> папка на диске Д)
> а D:\Work - нет
> D:\Pictures - тоже нет
> только некоторые папки определяються.
Хм... А если сделать так:
procedure TForm1.Button1Click(Sender: TObject);
var
SR: TSearchRec;
s:string;
begin
if FindFirst('D:\*', $7F, SR) = 0 then
begin
repeat
s:='';
if (SR.attr and faReadOnly) = faReadOnly then S:=S+' faReadOnly';
if (SR.attr and faHidden) = faHidden then S:=S+' faHidden';
if (SR.attr and faSysFile) = faSysFile then S:=S+' faSysFile';
if (SR.attr and faVolumeID) = faVolumeID then S:=S+' faVolumeID';
if (SR.attr and faDirectory) = faDirectory then S:=S+' faDirectory';
if (SR.attr and faArchive) = faArchive then S:=S+' faArchive';
if (SR.attr and faSymLink) = faSymLink then S:=S+' faSymLink';
Memo1.Lines.Add(SR.Name+' Атрибуты:'+s);
until FindNext(SR) <> 0;
FindClose(SR);
end;
end;
то какие атрибуты будут иметь эти самые твои "папки но не директории"?
Игорь Шевченко (2009-12-02 02:39:00) [11]
> if GetFileAttributes ('D:\BackUp') = FILE_ATTRIBUTE_DIRECTORY
Больно слышать
Германн (2009-12-02 02:11:00) [12]
> Riply © (02.12.09 01:59) [11]
>
> > [10] Германн © (02.12.09 01:54)
>
> > Саш. А можно поправлю?
>
> Нужно ! :)
>
Пиши статью.
Riply (2009-12-02 01:59:00) [13]> [10] Германн © (02.12.09 01:54)
> Саш. А можно поправлю?
Нужно ! :)
Германн (2009-12-02 01:54:00) [14]
> Riply © (02.12.09 01:44) [8]
Саш. А можно поправлю?
Файл имеет тип директория когда в его атрибутах установлен флаг FILE_ATTRIBUTE_DIRECTORY
Германн (2009-12-02 01:49:00) [15]
> serhiyiv © (02.12.09 01:29) [7]
>
> Народ спасибо за советы, но кто нибудь пробовал сначала
> сделать то что вы пишете?
> Что то оно не работает.
>
Может лучше сначала почитать учебник? А потом "возникать"!
Ну кто так сравнивает
> if GetFileAttributes ('D:\BackUp') = FILE_ATTRIBUTE_DIRECTORY
> then begin
?
Riply (2009-12-02 01:44:00) [16]> [7] serhiyiv © (02.12.09 01:29)
1. Нет такого объекта "папка"
2. Объект имеет тип директория когда в его (атрибуты and FILE_ATTRIBUTE_DIRECTORY) <> 0;
serhiyiv (2009-12-02 01:29:00) [17]Народ спасибо за советы, но кто нибудь пробовал сначала сделать то что вы пишете?
Что то оно не работает.
Вот что исходит из всего этого:
faDirectory - это вовсе не какая ни ПАПКА, это директория. Да смешно получаеться. По идеи папка = Directory. Но только по идеи. На практике оно таким не явлеться. Или я что то не так делаю или что, но я уже перепробовал разные варианты.
Например, если использовать GetFileAttributes
if GetFileAttributes ('D:\BackUp') = FILE_ATTRIBUTE_DIRECTORY then begin
Label1.Caption:='FOLDER';
то D:\BackUp - определяеться как папка (к стати это первая папка на диске Д)
а D:\Work - нет
D:\Pictures - тоже нет
только некоторые папки определяються.
Относительно FindFirst то это тоже фигня так как если использовать
faDirectory - то ищет оно как раз не все папки, а только те что есть так зваными "Директориями".
Может надо еще что то дописать чтоб эти функции правильно работали?
Попробуйте пожалуйста у себя проверить являеться та или иная папка "DIRECTORY" !!!
Вобще допустим есть список файлов и папок в перемешку, как теперь отсортировать папки от файлов?
Игорь Шевченко (2009-12-01 23:29:00) [18]GetFileAttributes вообще-то
SergP (2009-12-01 23:09:00) [19]
> Идея не верная, искать будет все, но флаг пригодится для
> определения.
>
> Сначала читаем хелп, потом советуем :)
Да. абсолютно согласен. Ищет оно все, но находит то что нам нужно... :)
Sha (2009-12-01 20:04:00) [20]> SP (01.12.09 19:16) [2]
Сначала читаем хелп, потом советуем :)