[C++ WinAPI] plik ZIP jako folder

0

Robię spis zawartości dysku/folderu za pomocą IShellFolder, IEnumIDList, PIDL.. Pod win2000 jest OK, ale pod XP nie. Jak zostanie napotkany plik *.zip to jest on traktowany jako folder (!) - IShellFolder->GetAttributesOf dla pliku *.zip zwraca atrybut SFGAO_FOLDER między innymi.
Atrybuty dla zip'a:
1100000010000000000000101110111

Dla innych plików:
1000000010000000000000101110111

Dla folderów:
1110000100000000000000101111111

ZIP od zwykłego pliku różni się tylko SFGAO_FOLDER. Natomiast różnica między folderem a plikiem to kilka atrybutów.

Jak prawidłowo ocenić, że obiekt jest folderem a nie plikiem, nie tylko na podstawie tego, że wybiorę sobie jakiś atrybut np.: SFGAO_storageancestor 0x00800000 ???

0

Jak prawidłowo ocenić, że obiekt jest folderem a nie plikiem, nie tylko na podstawie tego, że wybiorę sobie jakiś atrybut np.: SFGAO_storageancestor 0x00800000 ???

No ja właśnie z tą flagą sprawdzałem czy jest to właściwy katalog

if((attrib&SFGAO_FOLDER)&&(attrib&SFGAO_FILESYSANCESTOR))
{
  /* file system folder */
}

Możesz jeszcze pokombinować z tymi flagami:

SFGAO_CANMONIKER
SFGAO_HASSTORAGE
SFGAO_STREAM
SFGAO_STORAGEANCESTOR
0

No właśnie taki sam sposób zrobiłem. Zastanawia mnie tylko czy to jest uniwersalne. Czy później nie okaże się, że inny plik sprawia ten sam problem, ale z inną kombinacją flag :)

0

Heh no tej pewności nie będziesz miał ;) Jak robiłem kontrolki do przeglądania katalogów/plików to z tymi flagami traktowało zipy jak normalne pliki tyle, że przy porównywaniu za pomocą IShellFolder::CompareIDs trochę zamulało (szczególnie przy zip'ach z setkami plików wewnątrz) :/ - czyli powłoka wykonywała operacje jak dla folderu... virtualnego.

0

I no właśnie nie może tak być. Przy robieniu spisu z np. płyty DVD atrybuty dla plików wynoszą 0x00000000 a dla folderów tylko SFGAO_FOLDER. Więc taaaaaaaaaaa.....
I jak to teraz zrobić..
Nie lepiej użyć FindFirstFile.. lub findfirst zamiast tego IShellowegoFolderstwa?

0

I no właśnie nie może tak być. Przy robieniu spisu z np. płyty DVD atrybuty dla plików wynoszą 0x00000000 a dla folderów tylko SFGAO_FOLDER. Więc taaaaaaaaaaa.....

Coś źle musisz robić jeżeli masz takie atrybuty.

Nie lepiej użyć FindFirstFile.. lub findfirst zamiast tego IShellowegoFolderstwa?

Szczerze? Jeżeli nie piszesz kontrolki, która ma 'udawać' explorator'a i nie intresuje Cię dostęp do virtualnych katalogów to tak, prościej będzie użyć funkcji FindFirstFile itd.

0

Nie, źle nie robię. Dla danych z dysku atrybuty są po prostu inne niż z płyty.
Interesuje mnie po prostu zrobienie spisu zawartości danego Dysku/Folderu/Płyty więc chyba FindFirstFile będzie lepszym wyjściem.

0

Gdy korzysta sie z IShellFolder to ma sie dostep do wirtualnych folderow, mozna jeszcze sprobowac z flaga SFGAO_FILESYSTEM (to, ze jest czescia plikow, folderow - 'prawdziwych').

Ale trzeba pamietac, ze np temporary internet files to tez wirtualny folder i tylko ma opcje (mozliwosc) zwracania sciezki do realnego pliku, ktory sie w nim znajduje (podobnie zachowuje sie aktowka, moj komputer, panel sterowania-ten nie zwraca sciezki, ...)

zatem najlepszy wybor to findfirstfile jesli chce sie miec tylko pliki 'prawdziwe'.

1 użytkowników online, w tym zalogowanych: 0, gości: 1