0

以前はファイルの特性を取得していlstatましたが、機能していないようで、-1 とエラー -No such file or directory- が返されます。

次のように入力して、シェルでパスを試します。

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

したがって、このパスは明らかに で機能しますが、 !lsでは機能しません。lstatとても奇妙です。これは私が呼び出す行ですlstat

int i=lstat(path, &buff );

pathchar[]およびはオブジェクトですbuffstruct stat

アイデアがあればお願いします...

4

5 に答える 5

4

これは正しい動作です。あなたのパスは存在しません。

ドキュメントから:

戻り値 正常に完了すると、値 0 が返されます。それ以外の場合は、値 -1 が返され、エラーを示すために errno が設定されます。

@Noufalが述べているように、パスを印刷してみることができます。パスに が\n追加されている可能性があります。で読んだ場合、これは可能性がありますfgets

于 2010-12-19T15:47:11.233 に答える
1

のマニュアルページからfgets

fgets() は、stream から最大で size 未満の 1 文字を読み取り、s が指すバッファーに格納します。EOF または改行の後、読み取りは停止します。改行が読み取られると、バッファに格納されます。終端のヌル バイト ('\0') は、バッファの最後の文字の後に格納されます[...]。

これがあなたの状況です。

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

これを覚えておいてください!それが役に立ったことを願っています。

于 2016-07-08T11:08:33.063 に答える
1

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ファイルは、(改行) 文字を「使用」して、ファイル内の異なるエントリを区切ります。

を使用して読み取るとfgetspath変数は毎回、終了\n文字を含む「パスファイル」から読み取られた完全な行で埋められます。したがって、プログラム メモリ内を調べると、 (fgets への最初の呼び出しの後) のpathように見えることがわかります。/path/to/yourfile.c\n\0somegarbage

ここで、文字列の終わりを示す の\n直前にあるを削除する必要があります。 コメントの1つに書いたように、これを行うために使用できますが、IMHO、もっと簡単な方法があります。\0
memset

于 2010-12-19T21:08:16.887 に答える
0

ご回答ありがとうございます。私が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
       }
}

エラーはパス名である必要があります。

于 2010-12-19T16:50:36.573 に答える
0

まず、エラー値を見てください。パスは存在する可能性がありますが、それ以外の場合は到達可能です。

于 2010-12-19T15:50:25.963 に答える