2014-11-08 21 views
0

我需要刪除給定的路徑使用unlinkat()目錄,程序運行良好,但它不會刪除(取消鏈接)該目錄(順便說一句)。使用man7文檔unlinkat()我有以下代碼:unlinkat()在C目錄

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <time.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <pwd.h> 
#include <grp.h> 
#include <dirent.h> 
#include <fcntl.h> 

void main(int argc,char *argv[]){ 
    DIR *dirp; 


    if ((dirp = opendir(argv[1]))== NULL){ 
      fprintf(stderr, "Couldn't open the directory %s: %s \n",argv[1],strerror(errno)); 
      exit(1); 
    } 
    unlinkat(dirp,argv[1],AT_REMOVEDIR); 


    exit(0); 



} 

在參數給出的路徑是從我要刪除

+0

'unlinkat'返回什麼?通話後有什麼'errno'? – Mat 2014-11-08 18:40:47

+1

您在'opendir()'和'unlinkat()'中使用相同的目錄。所以如果'argv [1]'是'foo/bar',它會嘗試刪除'foo/bar/foo/bar'。 – Barmar 2014-11-08 18:44:13

+0

我改變了它的問題,我複製了一段沒有unlinkat()的代碼。@ Mat錯誤說'壞文件描述符' – tony 2014-11-08 18:46:19

回答

0

dirp文件夾的父親相對是一個指向目錄句柄(DIR *),但unlinkat()的第一個參數必須是目錄描述符,或AT_FDCWD(用於「當前工作目錄」)。這在unlinkat()手冊頁中明確說明。

您應該始終啓用編譯器警告(gcc爲-Wall)。在這種情況下,它也會指出你的問題。

要獲得dirp的基礎描述符,請使用dirfd(dirp)

這裏是一個實際的例子。它刪除第二個和更多參數中指定的(空)目錄,相對於作爲第一個參數指定的目錄/路徑。第一個參數中指定的目錄不會被刪除。

#define _POSIX_C_SOURCE 200809L 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <dirent.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
#include <errno.h> 

int main(int argc, char *argv[]) 
{ 
    DIR *dirp; 
    int arg, retval; 

    if (argc < 3 || !strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) { 
     fprintf(stderr, "\n"); 
     fprintf(stderr, "Usage: %s [ -h | --help ]\n", argv[0]); 
     fprintf(stderr, "  %s BASE-DIRECTORY ITEM-TO-REMOVE ...\n", argv[0]); 
     fprintf(stderr, "\n"); 
     return EXIT_FAILURE; 
    } 

    dirp = opendir(argv[1]); 
    if (!dirp) { 
     fprintf(stderr, "%s: %s.\n", argv[1], strerror(errno)); 
     return EXIT_FAILURE; 
    } 

    retval = EXIT_SUCCESS; 
    for (arg = 2; arg < argc; arg++) { 
     if (unlinkat(dirfd(dirp), argv[arg], AT_REMOVEDIR)) { 
      fprintf(stderr, "%s: %s.\n", argv[arg], strerror(errno)); 
      retval = EXIT_FAILURE; 
     } 
    } 

    closedir(dirp);  
    return retval; 
}