2015-11-16 2 views
-2

Я пытаюсь выяснить тип файла, не используя внешние библиотеки или команду «файл».Определение типа файла в C

Я просмотрел несколько сообщений и потоков, и они указывают на использование функции stat() (unix man stat) и игры с «st_mode» из stat struct.

Но я не знаю, как это сделать, и я не могу найти хороший пример этого.

Например, программа принимает файл F, я хочу иметь возможность читать F, аналогичную программе ниже, и давать аналогичный результат. И filetype F является PDF, но на нем нет расширения.

ДАЛЬНЕЙШИЙ ПРИМЕР: Если у меня есть foo.pdf, но я изменил расширение на * .png (foo.png), я могу передать свою программу «foo.png» и сказать, что это infact .pdf-файл.

Когда файл будет создан, он делает «магическое число», например, с помощью PDF, магическое число PDF файлов начинаются с «% PDF» (шестнадцатеричный 25 50 44 46).»

Как может Я использую магическое число, чтобы выяснить тип файла.

Я понимаю, какой тип таблицы должны быть сделаны в моем конце, чтобы поддержать файлы. И я только делаю небольшую горсть < 10.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

void errorInput() 
{ 
    fprintf(stderr, "\nYou have received this message due to an error. \n"); 
    fprintf(stderr, "Please type 'filetype <file>' to properly execute the program.\n"); 
    fprintf(stderr, "Thank you and have a fine day! \n\n"); 
    exit(0); 
} 

int main(int argc, char *argv[]) 
{ 

    char command[128]; 

    if (argc == 2) 
    { 
    strcpy(command, "file "); 
    strcat(command, argv[1]); 
    system(command); 
    } 
    else 
    { 
    errorInput(); 
    } 

    return 0; 
} 

Заранее благодарен!

+9

* "Я пытаюсь выяснить тип файла файла »* Что именно вы имеете в виду« тип файла »? Вы пытаетесь определить, является ли это, например, файл PDF в сравнении с EXE или BMP? Нет простого способа сделать это. Вы должны использовать базу данных для идентификации функций, например. 'libmagic', который используется' file'. Не пытайтесь изобрести колесо здесь. –

+0

Использует ли «без использования внешних библиотек» собственный список '' '' '' '' '' '' '' '' '' '' '' '' '' '' файл '' Затем вы должны найти спецификации файлов для всех типов, которые вы хотите распознать, и выполнить проверку самостоятельно. Это даже не очень сложно или что-то еще ... просто целая работа. – usr2564301

+0

«Вы пытаетесь определить, есть ли это файл PDF в сравнении с EXE или BMP?» Да, именно это. – user3247187

ответ

-3

Во-первых, вам необходимо включить системы/stat.h

Далее, вам нужно объявить STRUCT стат в коде:

struct stat s 

Далее вы передаете указатель на структуру вашей стат вместе с имя файла/объект:

returnval = stat("filename", &s); 

Проверьте возвращаемое значение, вы получите < 0 в случае ошибки. Если нет ошибки объекта/файл существует, мы можем использовать функцию макросъемки, чтобы определить тип файла:

if (S_ISREG(s.st_mode)) 
    /* Regular text file... */ 
else if (S_ISDIR(s.st_mode)) 
    /* Is a directory.... */ 

Я предлагаю вам взглянуть на странице человека (человек 3 стата), и это даст вам все типы, для которых st_type потенциально может быть (его можно использовать для идентификации файлов, каталогов, блочных устройств, символических ссылок и т. д.)

Другим очень полезным членом структуры stat является st_size, который дает вам размер файлов в байтах.

ETA - системный вызов stat() не укажет вам, является ли файл PDF или что-то в этом роде - обычно мы будем использовать расширение, если расширение отсутствует, и вы пытаетесь определить конкретный файл форматы, то stat() не будет очень полезен для вас.

+0

Извините, но это не помогает ОП определить, есть ли у него файл PDF или нет, как он упоминал в вопросе. –

+0

Я не думаю, что это то, о чем спрашивает ОП. OP хочет определить, является ли файл PDF, txt, изображение и т. Д. – kaylum

+0

Я знаю - он упомянул stat() и что он не мог найти примеров того, как его использовать, поэтому я предоставил его. Вы правы, хотя мой ответ бесполезен для OP. Много извинений. – Nunchy

-1

В большинстве файлов обычно указывается часть, называемая Header/MetaData. Именно в этой части/сегментах файла будет содержаться подробная информация о файле, который он сам. Также эти сегменты Headers/MetaData также содержат Signature для идентификации типа файла.Но помните, большинство из них Signatures будет в Hex Signature format

Пример

PDF Подпись - 25 50 44 46 (В Hex) или %PDF JPEG Подпись - Start FF D8 и конец файла FF D9

Таким образом, в основном вы нужно открыть файл в двоичном формате и проанализировать структуру файла и сравнить его, чтобы увидеть, совпадает ли он с любым из типов файлов, которые вы определяете в своей программе. Как предполагается, вы хотите проверить, есть ли файл pdf, тогда вам нужно сначала открыть файл в двоичном режиме t купите файл, пока не получите bytcode/hex code, который соответствует bytcode/hex code файла pdf. Используйте функцию Cfopen() в двоичном режиме i.e "rb".

Или вы можете открыть файл, обычно без двоичном режиме, как это,

unsigned int data; 
data=fgetc(pfile); 

Вы можете захотеть взглянуть на это для получения более подробной информации,

  1. Magic Number
  2. File Signatures
+2

ну, цифры на самом деле не в шестнадцатеричном формате, они просто цифры, вы можете смотреть на них так, как хотите. Если вы говорите о том, как цифры перечислены в какой-либо справочной документации, то да, вы правы. Это было просто написано немного неоднозначно. (Я не с нисходящим - я бы честно прокомментировал, если бы был) –

2

Как Джонатан Рейнхарт Направленный, не tr у изобрести использование колеса libmagic:

#include <stdio.h> 
#include <magic.h> 

int main(void) { 
    struct magic_set *magic = magic_open(MAGIC_MIME|MAGIC_CHECK); 
    magic_load(magic,NULL); 

    printf("Output1: '%s'\n",magic_file(magic,"ValgrindOut.xml")); 
    printf("Output2: '%s'\n",magic_file(magic,"program")); 
    printf("Output3: '%s'\n",magic_file(magic,"Chapter9.pdf")); 
    printf("Output4: '%s'\n",magic_file(magic,"test.txt")); 
    printf("Output5: '%s'\n",magic_file(magic,"linux-3.17.tar.xz")); 
    printf("Output6: '%s'\n",magic_file(magic,"gcc-5.2.0.tar.gz")); 
    printf("Output7: '%s'\n",magic_file(magic,"/home/michi")); 

    return 0; 
} 

Compile:

gcc -o program program.c -lmagic 

Выход:

Output1: 'application/xml; charset=us-ascii' 
Output2: 'application/x-executable; charset=binary' 
Output3: 'application/pdf; charset=binary' 
Output4: 'text/plain; charset=utf-8' 
Output5: 'application/x-xz; charset=binary' 
Output6: 'application/gzip; charset=binary' 
Output7: 'inode/directory; charset=binary' 
+0

Это выполнило свою работу, спасибо. – user3247187

Смежные вопросы