Как получить путь к файлу, перетащенному в приложение Win32, и удалить его? - PullRequest
0 голосов
/ 15 февраля 2010

У меня есть программа, и когда они помещают в нее файлы, я хочу, чтобы она получала путь, показывала окно сообщения «пути», а затем удаляла ее. Может кто-нибудь пролить свет на то, как это сделать?

1 Ответ

9 голосов
/ 23 февраля 2010

Прежде всего, вам понадобится окно, которое может принимать пропущенные файлы. Это достигается установкой ExStyle вашего окна на WS_EX_ACCEPTFILES:

//Create a window.
hWnd = CreateWindowEx
    WS_EX_ACCEPTFILES,      // Extended possibilites for variation.
    gsClassName,            // Classname.
    gsTitle,                // Title caption text.
    WS_OVERLAPPEDWINDOW,    // Default window.
    CW_USEDEFAULT,          // X Position.
    CW_USEDEFAULT,          // Y position.
    230,                    // Window starting width in pixils.
    150,                    // Window starting height in pixils.
    HWND_DESKTOP,           // The window is a child-window to desktop.
    (HMENU)NULL,            // No menu.
    hInstance,              // Program Instance handler.
    NULL                    // No Window Creation data.
);

Во-вторых, вам нужно обработать сообщение WM_DROPFILES в вашем обратном вызове WinProc ().

if(uMessage == WM_DROPFILES)
{
    HDROP hDropInfo = (HDROP)wParam;
    char sItem[MAX_PATH];
    for(int i = 0; DragQueryFile(hDropInfo, i, (LPSTR)sItem, sizeof(sItem)); i++)
    {
        //Is the item a file or a directory?
        if(GetFileAttributes(sItem) &FILE_ATTRIBUTE_DIRECTORY)
        {
            //Delete all of the files in a directory before we can remove it.
            DeleteDirectoryRecursive(sItem);
        }
        else {
            SetFileAttributes(sItem, FILE_ATTRIBUTE_NORMAL); //Make file writable
            //DeleteFile(sItem);
        }

    }
    DragFinish(hDropInfo);
}

В-третьих, вам понадобится функция, которая может удалять все подкаталоги и файлы из любых каталогов, перетаскиваемых в ваш диалог:

bool DeleteDirectoryRecursive(const char *sDir)
{ 
    WIN32_FIND_DATA fdFile; 
    HANDLE hFind = NULL; 

    char sPath[2048]; 

    //Specify a file mask. *.* = We want everything! 
    sprintf(sPath, "%s\\*.*", sDir); 

    if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE) 
    { 
        printf("Path not found: [%s]\n", sDir); 
        return false; 
    } 

    do 
    { 
        //Find first file will always return "."
        //    and ".." as the first two directories.
        if(strcmp(fdFile.cFileName, ".") != 0
                && strcmp(fdFile.cFileName, "..") != 0) 
        { 
            //Build up our file path using the passed in 
            //  [sDir] and the file/foldername we just found: 
            sprintf(sPath, "%s\\%s", sDir, fdFile.cFileName); 

            //Is the entity a File or Folder? 
            if(fdFile.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY) 
            { 
                DeleteDirectoryRecursive(sPath); //Recursive call.
            } 
            else{ 
                printf("File: %s\n", sPath);
                SetFileAttributes(sPath, FILE_ATTRIBUTE_NORMAL);
                //DeleteFile(sPath);
            } 
        } 
    } 
    while(FindNextFile(hFind, &fdFile)); //Find the next file. 

    FindClose(hFind); //Always, Always, clean things up! 

    SetFileAttributes(sDir, FILE_ATTRIBUTE_NORMAL);
    //RemoveDirectory(sDir); //Delete the directory that was passed in.

    return true; 
} 

Наконец, вам нужно быть ОЧЕНЬ ОСТОРОЖНЫ с этим фрагментом - он все-таки удаляет файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...