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