2013-05-15 2 views
0

Я пытаюсь записать содержимое каталога Windows в файл с помощью c. Например, если у меня был каталог JPEGs (т.е. каталог, который содержит несколько JPEGs) и хотел, чтобы преобразовать их в .raw файл, у меня есть что-то вроде этого:открыть каталог файлов Windows для чтения/записи в c

#include <stdio.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdlib.h> 

typedef uint8_t BYTE; 

#define BLOCK 512*sizeof(BYTE); 

int main(void) 
{ 
    FILE * fd = fopen("C:\\jpegs", "r"); 
    if (fd == NULL) { 
     fprintf(stderr, "Error opening device file.\n"); 
     return EXIT_FAILURE; 
    } 
    int block = BLOCK; 
    FILE * fn = fopen("new.raw", "w+"); 
    void * buff = malloc(block); 
    while(feof(fd) == 0) { 
     fread(buff,block,1,fd); 
     fwrite(buff,block,1,fn); 
    } 
    free(buff); 
    fclose(fd); 
    fclose(fn); 
    return 0; 
} 

Проблема в том, я не думаю, что оконные каталоги заканчиваются EOF. Есть ли у кого-нибудь идеи о том, как это решить?

+0

Что такое «каталог файлов Windows» _? Что такое 'jpegs', это файл или это каталог? _ «Или в более общем плане, как окна разбивают свои каталоги и/или жесткие диски в памяти?» _ - Я сейчас царапаю голову ... Непосредственный вопрос: вы действительно знаете, какие термины _memory_ и _partition_ на самом деле имею в виду? Я спрашиваю, потому что они не имеют никакого отношения к вашей проблеме. –

+0

это каталог. извините за запутанный язык. Ой, написал, что быстро, не задумываясь о том, что я пытался спросить. Я предполагаю, что я пытался спросить, как окна каталогов дифференцированы друг от друга в памяти. Или сформулировал другой способ, что именно читает чтение, когда я использую fopen в каталоге? – mrizzo

+0

Потому что, когда я запускаю этот скрипт, он просто продолжает работать и продолжает писать больше байтов в new.raw, чем в каталоге jpegs. – mrizzo

ответ

1

В системах Unix, хотя вы можете открыть каталог для чтения, вы не можете его прочитать, если не используете семейство вызовов opendir()10, readdir(), closedir(). Вы не можете писать в каталог в Unix; даже суперпользователь (root) не может этого сделать. (Основная причина открытия каталога, чаще всего с open(), чем fopen(), заключается в том, что вы можете использовать chdir(), а затем fchdir(), чтобы вернуться к тому, с чего вы начали, или использовать различные функции , например openat(), для ссылки на каталог.)

В Windows вы должны, как минимум, использовать режим "rb", но, честно говоря, я бы не ожидал, что вы сможете многое с ним поделать. Вероятно, есть аналогии с функциями Unix opendir() в Windows API, и вы должны использовать их вместо этого.

+1

У Windows API есть opendir()/readdir()/closedir(), поскольку они необходимы для соответствия POSIX ... что-то windows отчаянно хотело сделать –

+0

@AhmedMasud: спасибо за информацию. Я не был уверен, были ли они частью основного API Windows или частью «POSIX-гетто», где функции POSIX переименовываются с префиксом подчеркивания, поскольку в противном случае они вторгаются в пространство имен пользователя. –

+1

Когда-то давно в устаревшем файловом типе под названием «Unix File System», который имел ограничение на 14 символов в имени файла и 2 байта для номера inode, можно было открыть каталог и прочитать имена (и номера inode, хотя вы не могли с ними ничего сделать), используя простые 'open()', 'read()', 'close()'. IIRC, вы можете найти такой код как в K & R («Язык программирования C»), так и в K & P («среда программирования UNIX»).В дни 7-го выпуска UNIX не было интерфейса 'opendir()' etc. Это появилось в BSD Fast File System. –

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