Восстановить удаленный файл с помощью undelete() в C

#c #macos #undelete

#c #macos #восстановить

Вопрос:

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

 man undelete
  

Имя
восстановить — попытка восстановить удаленный файл

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

КРАТКИЙ ОБЗОР #включить

  int
 undelete(const char *path);
  

Описание

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

Со временем 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=amp;a;
    return undelete(pa);
}
  

Но когда я запускаю программу, оболочка возвращает 255.

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

Комментарии:

1. на странице руководства указано, что при восстановлении устанавливается ошибка. Итак, вызовите perror, чтобы узнать, в чем ошибка.

2. Обратите внимание, что в документации говорится: «В настоящее время это работает только тогда, когда именованный объект является белым в файловой системе union.». Это довольно экзотическая конфигурация, так что, вероятно, это не тот случай для вас.

3. char a="/Users/Leo/Desktop/test/a.out"; <- недопустимое значение символа. Вы также используете неправильный тип. Строковые литералы должны быть либо указателем на постоянные символы ( const char *a = "..."; ), либо массивом постоянных символов ( const char a[] = "..."; )

Ответ №1:

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

#включить <unistd.h> 
int main(int argc, char **argv)
{
 char * path = argc > 1 ? argv[ 1 ]: "a.out";

 если( восстановить (путь))
 ошибка ( путь);
 возвращает 0; 
}

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

Комментарии:

1. Я попробовал ваш код, и ошибка гласит / Users /Leo / Desktop /test/test: такого файла или каталога нет. На самом деле я создал и удалил файл «test» для тестирования

2. Читать lwn.net/Articles/325369 . Для восстановления вам нужна запись каталога для работы. Простое использование rm в path, безусловно, не сработает, если ваша файловая система не является файловой системой union.

Ответ №2:

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

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

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

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

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

Комментарии:

1. Спасибо. Я понял. Но программа все еще не работает после того, как я исправил такую глупую ошибку. ошибка не отображается /Users/Leo/Desktop/test/тест: нет такого файла или каталога. На самом деле я создал и удалил файл «test» для тестирования. Есть дополнительная информация? Спасибо

2. На странице руководства написано: В настоящее время это работает только тогда, когда именованный объект является белым в файловой системе union. Это означает, что он будет работать только с подключением union (см., Например, эту статью о том, как его настроить). Это не будет работать на ваших обычных точках монтирования HFS .