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

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

FILE / FOLDER


Страницы:   1 2

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
   FileAttrs := FileAttrs + faArchive;
if CheckBox7.Checked then
   FileAttrs := FileAttrs + faAnyFile;
вместо арифметических операторов при работе с атрибутами файла надо использовать логические, в частности, здесь плюс надо заменить на OR.
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]

Сначала читаем хелп, потом советуем :)


Страницы:   1 2

Наверх

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