Текущий архив: 2010.01.24;
Скачать: CL | DM;
Вниз
FILE / FOLDER Найти похожие ветки
← →
serhiyiv © (2009-12-01 19:00) [0]Народ привет. Подскажите пожалуйста как отличить файл от папки? Можно использовать if FolderExists но хотелось бы по другому. И вообще какая разница между ними? Как программисты придумали папки и ОС может их различать от файлов?
← →
Anatoly Podgoretsky © (2009-12-01 19:06) [1]> serhiyiv (01.12.2009 19:00:00) [0]
FindFirst
← →
SP (2009-12-01 19:16) [2]второй параметр в FindFirst
faAnyFile - будет искать файлы
faDirectory - по идее должно искать папки.
← →
Anatoly Podgoretsky © (2009-12-01 19:18) [3]> SP (01.12.2009 19:16:02) [2]
Идея не верная, искать будет все, но флаг пригодится для определения.
← →
Sha © (2009-12-01 20:04) [4]> SP (01.12.09 19:16) [2]
Сначала читаем хелп, потом советуем :)
← →
SergP © (2009-12-01 23:09) [5]
> Идея не верная, искать будет все, но флаг пригодится для
> определения.
>
> Сначала читаем хелп, потом советуем :)
Да. абсолютно согласен. Ищет оно все, но находит то что нам нужно... :)
← →
Игорь Шевченко © (2009-12-01 23:29) [6]GetFileAttributes вообще-то
← →
serhiyiv © (2009-12-02 01:29) [7]Народ спасибо за советы, но кто нибудь пробовал сначала сделать то что вы пишете?
Что то оно не работает.
Вот что исходит из всего этого:
faDirectory - это вовсе не какая ни ПАПКА, это директория. Да смешно получаеться. По идеи папка = Directory. Но только по идеи. На практике оно таким не явлеться. Или я что то не так делаю или что, но я уже перепробовал разные варианты.
Например, если использовать GetFileAttributes
if GetFileAttributes ("D:\BackUp") = FILE_ATTRIBUTE_DIRECTORY then begin
Label1.Caption:="FOLDER";
то D:\BackUp - определяеться как папка (к стати это первая папка на диске Д)
а D:\Work - нет
D:\Pictures - тоже нет
только некоторые папки определяються.
Относительно FindFirst то это тоже фигня так как если использовать
faDirectory - то ищет оно как раз не все папки, а только те что есть так зваными "Директориями".
Может надо еще что то дописать чтоб эти функции правильно работали?
Попробуйте пожалуйста у себя проверить являеться та или иная папка "DIRECTORY" !!!
Вобще допустим есть список файлов и папок в перемешку, как теперь отсортировать папки от файлов?
← →
Riply © (2009-12-02 01:44) [8]> [7] serhiyiv © (02.12.09 01:29)
1. Нет такого объекта "папка"
2. Объект имеет тип директория когда в его (атрибуты and FILE_ATTRIBUTE_DIRECTORY) <> 0;
← →
Германн © (2009-12-02 01:49) [9]
> serhiyiv © (02.12.09 01:29) [7]
>
> Народ спасибо за советы, но кто нибудь пробовал сначала
> сделать то что вы пишете?
> Что то оно не работает.
>
Может лучше сначала почитать учебник? А потом "возникать"!
Ну кто так сравнивает
> if GetFileAttributes ("D:\BackUp") = FILE_ATTRIBUTE_DIRECTORY
> then begin
?
← →
Германн © (2009-12-02 01:54) [10]
> Riply © (02.12.09 01:44) [8]
Саш. А можно поправлю?
Файл имеет тип директория когда в его атрибутах установлен флаг FILE_ATTRIBUTE_DIRECTORY
← →
Riply © (2009-12-02 01:59) [11]> [10] Германн © (02.12.09 01:54)
> Саш. А можно поправлю?
Нужно ! :)
← →
Германн © (2009-12-02 02:11) [12]
> Riply © (02.12.09 01:59) [11]
>
> > [10] Германн © (02.12.09 01:54)
>
> > Саш. А можно поправлю?
>
> Нужно ! :)
>
Пиши статью.
← →
Игорь Шевченко © (2009-12-02 02:39) [13]
> if GetFileAttributes ("D:\BackUp") = FILE_ATTRIBUTE_DIRECTORY
Больно слышать
← →
SergP © (2009-12-02 06:23) [14]
> то 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;
то какие атрибуты будут иметь эти самые твои "папки но не директории"?
← →
Anatoly Podgoretsky © (2009-12-02 07:33) [15]> serhiyiv (02.12.2009 01:29:07) [7]
Ну проверили - работает!
Отсортировать faDirectory
Читай http://www.podgoretsky.com/Redir.aspx?id=137&DownloadFile=~/ddp/bits.aspx
← →
Sha © (2009-12-02 10:09) [16]С FindFirst/FindNext не все так очевидно, как может показаться на первый взгляд. В хелпе сказано: The Attr parameter specifies the special files to include in addition to 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
← →
serhiyiv © (2009-12-02 12:55) [17]
> Может лучше сначала почитать учебник? А потом "возникать"!
Блин, так и думал что не правильно поймут... Просто писал я и не так как вы процетировали, а из "учебника" пример использовал, но результат тотже. Вот по тому я и спрасил пробовали ли вы ето на практике или вы просто знаете что надо сделать именно так. А вобще БОЛЬШОЕ СПАСИБО за помощь, я ведь все таки в разделе для начинающих пишу...
← →
Игорь Шевченко © (2009-12-02 13:14) [18]
> а из "учебника" пример использовал
выброси учебник
← →
Anatoly Podgoretsky © (2009-12-02 13:38) [19]
> Sha © (02.12.09 10:09) [16]
Уже давно методы работы с аттрибутами в Дельфи устарели, но их так и не меняют, хотя достаточно было бы изменить маску faAnyFiles и константы флагов.
← →
Sha © (2009-12-02 13:50) [20]> Anatoly Podgoretsky © (02.12.09 13:38) [19]
> Уже давно методы работы с аттрибутами в Дельфи устарели,
Не совсем ясно, как можно было бы работать по-новому на базе все того же API.
← →
Юрий Зотов © (2009-12-03 00:17) [21]Ох, помнится, и накололся же я однажды с этим недокументированным в моей локальной MSDN флагом FILE_ATTRIBUTE_NOT_CONTENT_INDEXED. Код, вроде бы, железно правильный, а работает неверно - и кто ж мог знать, что они туда еще флагов понапихали?
← →
Германн © (2009-12-03 01:17) [22]
> serhiyiv © (02.12.09 12:55) [17]
>
>
> > Может лучше сначала почитать учебник? А потом "возникать"!
>
>
> Блин, так и думал что не правильно поймут... Просто писал
> я и не так как вы процетировали
Я цИтировал не с потолка, а из твоего сообщения. Так что извини. Код приведенный в сообщении должен быть именно такой, какой ты используешь.
← →
Sha © (2009-12-03 09:08) [23]> Юрий Зотов © (03.12.09 00:17) [21]
Мы недавно искали ошибку в одном продукте. Работал почти на всех компьютерах, но на некоторых не хотел ни в какую. Причина в том же.
Как оказалось, на тех, что работал, служба индексирования никогда не запускалась.
Страницы: 1 вся ветка
Текущий архив: 2010.01.24;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.01 c