Восстановить удаленный файл с помощью undelete () в C - PullRequest
0 голосов
/ 04 ноября 2011

Я просто пытаюсь восстановить файл на C на Volumn в формате HFS +. Согласно

man undelete

ИМЯ undelete - попытаться восстановить удаленный файл

БИБЛИОТЕКА Стандартная библиотека C (libc, -lc)

СИНТАКСИС #include

 int
 undelete(const char *path);

ОПИСАНИЕ

Системный вызов undelete() пытается восстановить удаленный файл с именем по пути. В настоящее время это работает, только когда названный объект Отключение в объединенной файловой системе. Системный вызов удаляет отключение вызывая любые объекты в нижнем слое стека объединения, чтобы стать видны еще раз.

В конце концов, функциональность undelete() может быть расширена до другого файла системы, способные восстановить удаленные файлы, такие как файл с лог-структурой система.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

Функция undelete() возвращает значение 0 в случае успеха; иначе возвращается значение -1 и глобальная переменная errno устанавливается в указать ошибку.

программа проста:

Текущий каталог (pwd) - / Users / Leo / Desktop /, и я нахожусь на Mac 10.7.2 с файловой системой HFS +.

#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.

Есть идеи? Спасибо

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Во-первых, вам нужно проверить возвращаемое значение и оценить его.Если это -1, то выведите сообщение об ошибке, например, с помощью perror или отформатировав сообщение об ошибке и используя strerror(errno).

. Но у вас также есть серьезная ошибка, прежде чем вы даже попытаетесь вызватьundelete:

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

Сначала будет присвоено значение (указатель на вашу строку) для char, однобайтового значения.Компилятор даже предупреждает об этом с предупреждением : инициализация делает целое число из указателя без приведения. В моем случае a тогда имел значение D / 0x44, но это могло быть что угодно.Затем вы сохраняете указатель на этот единственный байт в pa.Вместо этого вы хотите:

const char* pa="/Users/Leo/Desktop/test/a.out";
1 голос
/ 04 ноября 2011

восстановление не удалось. Чтобы узнать почему, проверьте errno. Например:

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

    if( undelete(path))
        perror( path );
    return 0;
}

Хотя, похоже, ваша проблема в том, что у вас есть символ вместо указателя символа. Вы должны были получить предупреждение компилятора.

...