使用C中的undelete()恢复已删除的文件

时间:2011-11-04 18:10:28

标签: c macos undelete

我只是想在HFS +格式化的Volumn上恢复C中的文件。根据

man undelete
  

命名        取消删除 - 尝试恢复已删除的文件

     

       标准C库(libc,-lc)

     

概要        #include

 int
 undelete(const char *path);
     

描述

     

undelete()系统调用尝试恢复已命名的已删除文件   通过路径。目前,仅当命名对象是a时才有效   联合文件系统中的whiteout。系统调用将删除白化   导致联合堆栈的下层中的任何对象变为   再次可见。

     

最终,undelete()功能可能会扩展到其他文件   能够恢复已删除文件的系统,例如日志结构文件   系统

     

返回值

     

如果成功,undelete()函数返回值0;除此以外   返回值-1,全局变量errno设置为   表明错误。

所以程序很简单:

当前目录(pwd)是/ Users / Leo / Desktop /我在使用HFS + Filesystem的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);
}

但是当我运行程序时,我得到的shell返回了255。

有什么想法吗?感谢

2 个答案:

答案 0 :(得分:1)

取消删除失败。要找出原因,请检查错误。例如:

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

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

虽然看起来你的问题是你有一个char而不是char指针。 你应该得到一个编译器警告。

答案 1 :(得分:1)

首先,您需要检查返回值并对其进行评估。如果为-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";