0

HFS+ フォーマットのボリュームで C のファイルを復元しようとしています。によると

man undelete

NAME undelete -- 削除されたファイルの復元を試みます

LIBRARY 標準 C ライブラリ (libc、-lc)

概要 #include

 int
 undelete(const char *path);

説明

システム コールはundelete()、パスで指定された削除済みファイルの回復を試みます。現在、これは指定されたオブジェクトがユニオン ファイル システムのホワイトアウトである場合にのみ機能します。システム コールによってホワイトアウトが削除され、ユニオン スタックの下位層にあるすべてのオブジェクトが再び表示されるようになります。

最終的にはundelete()、ログ構造のファイル システムなど、削除されたファイルを回復できる他のファイル システムに機能が拡張される可能性があります。

戻り値

成功した場合、undelete()関数は値 0 を返します。それ以外の場合、値 -1 が返さerrnoれ、エラーを示すためにグローバル変数が設定されます。

したがって、プログラムは単純です。

現在のディレクトリ (pwd) は /Users/Leo/Desktop/ で、HFS+ ファイルシステムを搭載した Mac 10.7.2 を使用しています。

#include <unistd.h>
int main()
{
    char a="/Users/Leo/Desktop/test/a.out";//I delete a.out using rm for testing
    const char* pa=&a;
    return undelete(pa);
}

しかし、プログラムを実行すると、シェルが 255 を返しました。

何か案が?ありがとう

4

2 に答える 2

1

undeleteが失敗しています。理由を確認するには、errnoを確認してください。例えば:

#include <unistd.h>
int main(int argc、char ** argv)
{{
    char * path = argc> 1?argv [1]: "a.out";

    if(undelete(path))
        perror(パス);
    0を返します。
}

問題は、charポインタではなくcharを使用していることです。コンパイラの警告が表示されるはずです。

于 2011-11-04T18:27:53.880 に答える
1

まず、戻り値を確認して評価する必要があります。-1 の場合は、エラー メッセージを出力します。たとえばperror、 エラー メッセージをフォーマットして を使用しstrerror(errno)ます。

しかし、呼び出しを試みる前に大きなバグもありますundelete:

char a="/Users/Leo/Desktop/test/a.out";
const char* pa=&a;

charこれにより、最初に値 (文字列へのポインター) が1 バイト値に割り当てられます。コンパイラは警告でそれについてさえ警告します: 初期化は、キャストなしでポインターから整数を作成します。私の場合、a値はD/0x44 でしたが、何でもかまいませんでした。次に、その 1 バイトへのポインタを に格納しますpa。代わりに必要なのは次のとおりです。

const char* pa="/Users/Leo/Desktop/test/a.out";
于 2011-11-04T18:50:48.090 に答える