lstat возвращает -1 - PullRequest
       2

lstat возвращает -1

0 голосов
/ 19 декабря 2010

Я использую lstat, чтобы получить характеристики файла, но он не работает, он возвращает -1 и ошибку - Нет такого файла или каталога -.

Я пробую путь в оболочке, набрав:

:~$ ls /home/mypc/Desktop/file.c
/home/mypc/Desktop/file.c

Так что этот путь, очевидно, работает с ls, но не с lstat! Это очень странно. Это строка, в которой я называю lstat:

int i=lstat(path, &buff );

path является char[], а buff является struct stat объектом.

Пожалуйста, если у вас есть идеи ...

Ответы [ 5 ]

3 голосов
/ 19 декабря 2010

Это правильное поведение. Твой путь не существует.

Из документации:

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ При успешном завершении возвращается значение 0. В противном случае значение из -1 возвращается, и errno устанавливается, чтобы указать на ошибку.

Как утверждает @Noufal, вы можете попробовать распечатать путь. Возможно, к вашему пути добавлен \n; это вероятно, если вы читаете это с fgets.

1 голос
/ 08 июля 2016

Со справочной страницы fgets:

fgets () считывает не более одного размера символов из потока и сохраняет их в буфер, на который указывает s. Чтение останавливается после EOF или перевод строки. Если читается новая строка, она сохраняется в буфере. Завершающий нулевой байт ('\ 0') сохраняется после последнего символа в буфер [...].

Так что это ваша ситуация.

path\n\0 ^^^^ ^ ^ 1234 5 6

Запомни это! Надеюсь, это помогло.

1 голос
/ 20 декабря 2010

На странице руководства fgets: If a newline is read, it is stored into the buffer.

Итак, вы пытаетесь lstat /path/yourfile.c\n.Очевидно, ваше имя файла yourfile.c, а не yourfile.c\n.

добавлено больше объяснений

Ваш "путь к файлу" похож на /path/to/yourfile.c\n/other/path/to/otherfile.txt\n.Файл "использует" \n (новая строка) символов для разделения различных записей в файле.

Когда вы читаете его, используя fgets, переменная path каждый раз заполняетсяполная строка считывается из «файла пути», включая завершающий символ \n.Так что, заглянув в память вашей программы, вы обнаружите, что path выглядит как /path/to/yourfile.c\n\0somegarbage (после первого вызова fgets).

Теперь вам нужно избавиться от конечного \nПрямо перед \0, который идентифицирует конец строки.
Как вы написали в одном из комментариев, вы можете использовать memset для этого, но, ИМХО, есть более простые способы.

0 голосов
/ 19 декабря 2010

Спасибо за ваш ответ. Это правильно, что я использую fgets для чтения строки из канала, которая дает мне пути. Проблема не в том, что файлы недоступны, потому что я проверил это. проблема заключается в самом пути. Я делаю:

while ( (fgets ( path, 512, f ) )) {//path name is f.e.: ./.local/share/Trash/files/myFile.c
       struct stat buff;
       //here I have the path and I give it in lstat
       if(lstat(&path[1], &buff )==0){ //I give path[1] and not path[0] to avoid the dot in the begining
       }
}

ошибка должна быть путём.

0 голосов
/ 19 декабря 2010

Прежде всего, посмотрите на значение ошибки. Путь может существовать, но в противном случае он будет доступен.

...