Доступ к другому диску в c

Я хочу просканировать каталог, проверив наличие JPEG-файлов (т.е. комбинации первых нескольких байтов) и скопировав их на другой диск. Я успешно протестировал эту программу, и она просматривает документы. Однако я не могу получить доступ ко всему каталогу (например, к моей случайно стертой SD-карте в D:/).

Вот как я пытался получить к нему доступ:

// remember the path from the command line
char *path = argv[1];

// open the path (preferably "D:\" - which is my SD-Card ;))
FILE *inptr = fopen(path, "r");
if (inptr == NULL)
{
    fprintf(stderr, "inputfile could not be read\n");
    return 1;
}

Вывод "входной файл не может быть прочитан" - поэтому я совершенно уверен, что ошибка именно здесь. Нужно ли обращаться к каталогу по-другому? Например. с помощью указателя на первый бит диска?

Я новичок, поэтому смейтесь осторожно. ;)

Большое спасибо! Марсель


person McCahen    schedule 06.08.2017    source источник
comment
Каково значение path? Как вы проверяете, имеет ли он ту ценность, которую, по вашему мнению, он имеет? Пожалуйста, обновите свой вопрос с исполняемым кодом, который воспроизводит ошибку.   -  person larsks    schedule 06.08.2017
comment
Вы не можете открыть каталог с помощью fopen. См. это.   -  person rustyx    schedule 06.08.2017
comment
fopen() можно использовать только для открытия определенного файла, а не каталога. Поэтому, если path не является путем к определенному файлу, скорее всего, это ваша проблема.   -  person Dsel    schedule 06.08.2017
comment
случайно стертая SD-карта, разве у них нет переключателя защиты от записи?   -  person Weather Vane    schedule 07.08.2017
comment
Обратите внимание, что вы должны включить имя файла в сообщение об ошибке, которое вы затем можете заключить в кавычки. fprintf(stderr, "file '%s' could not be opened for reading\n", path);, например, который также правильно сообщает об ошибках в стандартном потоке ошибок. Это помогает всем с отладкой.   -  person Jonathan Leffler    schedule 07.08.2017
comment
Большое спасибо! Вместе с ответом ниже я, вероятно, теперь смогу написать работающую программу. :) @larsks: Это 'D:\', набранное в командной строке (argv[1]). К сожалению, мне больше не понадобится мой код, но я его адаптирую (см. ответ ниже). Не могли бы вы предложить мне скопировать и вставить всю программу для следующего вопроса? Я не был уверен, не будет ли это ненужным спамом вопроса...   -  person McCahen    schedule 08.08.2017


Ответы (1)


'fopen()' не может открыть весь каталог или диск, он может открыть только определенный путь. Однако есть способы выполнить задачу вывода списка всех файлов в каталоге. Этот ответ уже содержит некоторую соответствующую информацию.

Поскольку вы уже можете открывать файлы, вы можете адаптировать цикл, показанный там, для выполнения операции.

while ((dir = readdir(d)) != NULL)
{
    printf("%s\n", dir->d_name);
    if (/*Check whether file has the .jpg extension or another test*/)
    {
        // perform your copy operation on the file
    }
}
person Scott Forsythe    schedule 07.08.2017
comment
Большое спасибо за быстрый ответ! Итак, fopen() может получить доступ только к отдельным файлам, поэтому вы предлагаете мне создать список всех файлов в каталоге и скопировать файлы с .jpg в имени. Аккуратный! Теперь я обнаружил, что readdir() возвращает следующую запись из каталога (спасибо, gnu.org). Я правильно понимаю: если файл был стерт и соответствующие биты не были перезаписаны, это все еще запись, которую readdir() может и распознает (?). - person McCahen; 08.08.2017
comment
Насколько я знаю, readdir будет читать только существующие неудаленные файлы. - person Scott Forsythe; 08.08.2017
comment
@McCahen: Если файл был стерт и соответствующие биты не были перезаписаны, это все еще запись, которую readdir() может и распознает (?). Нет. - person alk; 12.08.2017