删除C中的目录

问题描述 投票:0回答:3

我想删除C,Windows中的目录。我明白我必须首先删除目录中的所有文件,这是我感到困惑的部分。我找到了SHFileOperationIFileOperation虽然我不明白它们是如何从文档中实现的。

我目前的实施:

int dir_exists = 0;
snprintf(dir_name, STR_SIZE, "%s\\%s", LOCAL_DIR, tokens[1]);

// Check if directory exists
DWORD dwAttrib = GetFileAttributes(dir_name);
if (dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) {
    dir_exists = 1;
}

if (dir_exists == 1) {

    // Remove contents of directory (CURRENTLY UNIX)
    DIR *dir;
    struct dirent *d;
    char filepath[FNAME_SIZE];
    dir = opendir(dir_name);
    while (d = readdir(dir)) {
        sprintf(filepath, "%s/%s", dir_name, d->d_name);
        remove(filepath);
    }

    // Remove directory
    if ((RemoveDirectory(dir_name)) == 0) {
        printf("Error removing dictionary\n");
        return 0;
    }
}

我想要一个Windows替换部分注释不使用#include <dirent.h>因为我的VS没有这个头文件:

// Remove contents of directory (CURRENTLY UNIX)
c windows
3个回答
1
投票

解决方案信用:Link

正如解决方案所说,使用此功能时请小心,并确保双重终止pFrom

dir_name[STR_SIZE];
int dir_exists = 0;
snprintf(dir_name, STR_SIZE, "folder/dir_to_be_deleted");

// Check if directory exists
DWORD dwAttrib = GetFileAttributes(dir_name);
if (dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) {
    dir_exists = 1;
}

if (dir_exists == 1) {

    // Remove contents of directory 
    snprintf(dir_name, STR_SIZE, "%s/%s", LOCAL_DIR, tokens[1]);
    TCHAR szDir[MAX_PATH];
    StringCchCopy(szDir, MAX_PATH, dir_name);
    StringCchCat(szDir, MAX_PATH, TEXT("\\*"));

    int len = _tcslen(szDir);
    TCHAR* pszFrom = malloc((len + 4) * sizeof(TCHAR)); //4 to handle wide char
    StringCchCopyN(pszFrom, len + 2, szDir, len + 2);
    pszFrom[len] = 0;
    pszFrom[len + 1] = 0;

    SHFILEOPSTRUCT fileop;
    fileop.hwnd = NULL;    // no status display
    fileop.wFunc = FO_DELETE;  // delete operation
    fileop.pFrom = pszFrom;  // source file name as double null terminated string
    fileop.pTo = NULL;    // no destination needed
    fileop.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;  // do not prompt the user
    fileop.fAnyOperationsAborted = FALSE;
    fileop.lpszProgressTitle = NULL;
    fileop.hNameMappings = NULL;

    if (SHFileOperation(&fileop) != 0) {
        printf("Error SHFileOperation\n");
        return 0;
    }
    free(pszFrom);

    // Remove directory
    if ((RemoveDirectory(dir_name)) == 0) {
        printf("Error removing dictionary\n");
        return 0;
    }
}

0
投票

这是一个列出文件夹中所有文件和目录的简单程序:

#include <stdio.h>
#include <dirent.h>

int main(void)
{
    struct dirent *de;  // Pointer for directory entry

    // opendir() returns a pointer of DIR type. 
    DIR *dr = opendir(".");

    if (dr == NULL)  // opendir returns NULL if couldn't open directory
    {
        printf("Could not open current directory" );
        return 0;
    }

    while ((de = readdir(dr)) != NULL)
            printf("%s\n", de->d_name);

    closedir(dr);    
    return 0;
}

它似乎不如你的代码复杂。通过查看文件夹中每个条目的dirent结构,它是否是一个目录,如果是这样的中止,应该很容易找到。然后将printf更改为某种文件的delete语句。

您可能需要调用stat来告诉文件或目录。


-1
投票

这是一个简单的Windows批处理文件,可以完成这项工作。

@echo off
echo (batch file to remove a directory on windows)
cd  /d %tmp%
for /d %%i in (*) do (echo this directory contains a folder "%%i") & (echo so it cannot be deleted) & (goto :END)
for /r %%i in (*) do (echo del %%i)
:END  

更改第3行以使用您的目录。删除第5行的'echo'。如果你被锁定使用'c',你可以使用'system()'来运行它。

© www.soinside.com 2019 - 2024. All rights reserved.