Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Rozpoznawanie typów plików  (Przeczytany 6514 razy)

bercik06

  • Gość
Rozpoznawanie typów plików
« dnia: 2008-05-23, 02:15:39 »
Witam

Czy ktoś wie, jak za pomocą C/C++ rozpoznawać jakiego typu jest plik pod Linuksem? Np. podajemy jakąś ścieżkę do pliku w programie a on wypluwa nam jakiego typu jest ten plik (*.avi *.txt itp.).

Z góry dziękuję za pomoc

arctgx

  • Gość
Rozpoznawanie typów plików
« Odpowiedź #1 dnia: 2008-05-23, 13:07:44 »
Nie znam C/C++, ale istnieje przecież polecenie file i można zerknąć, z czego korzysta lub w razie gdyby miało potrzebne rzeczy wkompilowane statycznie, podejrzeć źródła. Spójrzmy na ldd.
  ~ $ ldd /usr/bin/file
linux-gate.so.1 =>  (0xb7ffa000)
libmagic.so.1 => /usr/lib/libmagic.so.1 (0xb7fc0000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7e72000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7e5d000)
/lib/ld-linux.so.2 (0xb7ffb000
Na swój nos zacząłbym od interesowania się biblioteką libmagic.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Rozpoznawanie typów plików
« Odpowiedź #2 dnia: 2008-05-23, 18:11:57 »
Skoro masz dokładną ścieżkę, a potrzebujesz rozszerzenie, to jest to kwestia obróbki stringa i wycięcia z odpowiedniej części.

Jednak problem jest taki, że Linux tak na prawdę olewa rozszerzenia. Ogromna większość aplikacji i środowisk graficznych używa nagłówków pliku do rozpoznania jego typu.
I jest to rozsądne działanie. Możesz mieć plik o nazwie "plik", a system i tak powie ci czy jest to film, dokument czy jeszcze coś innego. A w windowsie możesz wtedy wziąć hexedytor i pozgadywać.

Rozszerzenie to kiepski hack DOSa, bo programiści w ms nie umieli inaczej oznaczyć plików wykonywalnych (.com, .exe, potem .bat) - w Linuksie do tego służy atrybut wykonywalności. Owszem - warto je dodawać, ale głupotą jest na nich polegać.

bercik06

  • Gość
Rozpoznawanie typów plików
« Odpowiedź #3 dnia: 2008-05-23, 20:16:23 »
Dzięki za odpowiedź, ale chodzi mi o to, żebym mógł tylko określi co reprezentuje dany plik (np. że jest filmem). Wycinanie ze stringu jest kompletnym bezsensem, bo niektore pliki maja maja zapisane rozszerzenia, a niektore nie (a czasem bywa tak, że te które mają zapisane rozszerzeinie mają po kilka kropek i co wtedy?

mikolajS.

  • Gość
Rozpoznawanie typów plików
« Odpowiedź #4 dnia: 2008-05-26, 20:58:58 »
Musisz postudiować nagłówki plików (typy mime)
Przykładowo:
Jeżeli plik nie ma nagłówka a zaczyna się od znaku ascii rozpoznanego jako litera to linux traktuje go jak tekstowy.
HTML rozpoznaje po pierwszym tagu , podobnie xml i niektóre inne pliki
Pliki takie jak mp3 i avi itd. mają swoje nagłówki.
Najtrudniej jest chyba z rozpoznaniem binarnych bo te mogą mieć różny początek.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Rozpoznawanie typów plików
« Odpowiedź #5 dnia: 2008-05-26, 22:50:32 »
Pierwszym tagiem w HTMLu nie koniecznie musi być . Może być też doctype, chyba nawet komentarz () przed jest dopuszczalny.

Może najprościej poszukać jakiejś biblioteki pozwalającej na łatwe określenie typu mime danego pliku? Chyba coś takiego istnieje :P

mikolajS.

  • Gość
Rozpoznawanie typów plików
« Odpowiedź #6 dnia: 2008-05-28, 15:39:54 »
Faktycznie. Jeśli plik nie ma rozszerzenia to wystarczy w nim napisać tag aby system rozpoznawał go jako html
Można sobie przeczytać jak file sprawdza mime:
http://linux.die.net/man/1/file lub man file
Można bezpośrednio skorzystać z biblioteki:
http://linux.die.net/man/3/libmagic lub man libmagic