0

在你提到它之前,我不能使用 Boost 文件系统。:C

所以,我目前正在搞乱一个程序,该程序将文件扔到由密码生成的目录中。密码中的每个字符代表一个文件夹。我现在想创建一个从密码目录中检索文件并销毁整个目录的函数,但我似乎无法使用 FindFirstFile 从目录中正确获取文件名。

    WIN32_FIND_DATA data;
    HANDLE hFind;
    LPCWSTR LPCfilename;
    string directory = "";

    for(unsigned int i = 0; i<password.length(); i++)
    {
        directory= directory + password[password.length()-i-1]+"\\";
    }
    string filename = "*";
    directory = directory + filename +"\0";

    wstring tempd = wstring(directory.begin(), directory.end());
    LPCWSTR LPCdirectory = tempd.c_str();

    hFind = FindFirstFile(LPCdirectory, &data);
    while(hFind == INVALID_HANDLE_VALUE)
    {
        FindNextFile(hFind, &data);
    }
    if(hFind != INVALID_HANDLE_VALUE)
        LPCfilename = data.cFilename;

特别的问题似乎与我的最后一行有关:

LPCfilename = data.cFilename;

LPCfilename 正在接收的值仅转换为单个字符;这 ”。” 特点。虽然我的文件是一个名为“file”的.txt。

cFilename 似乎也包含值“。”,所以我不太确定是什么导致我没有收到正确的文件名。


这是我给出的答案给出的解决方案:

//deconstructs the labyrinth and returns file to the root folder
void ReleaseTheBeastBeyondThePortcullis(const string& password)
{
    HANDLE hFind;
    WIN32_FIND_DATAA data = {0};
    string directory = "";
    string filename = "";

    for(unsigned int i = 0; i<password.length(); i++)
    {
        directory= directory + password[password.length()-i-1]+"\\";
    }

    hFind = FindFirstFileA((directory + "*").c_str(), &data);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        do
        {
            if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
            {
                directory = directory + data.cFileName;
                filename = data.cFileName;
                break;
            }
        }
        while (FindNextFileA(hFind, &data));
        FindClose(hFind);
    }

    wstring tempd = wstring(directory.begin(), directory.end());
    LPCWSTR LPCdirectory = tempd.c_str();

    wstring tempf = wstring(filename.begin(), filename.end());
    LPCWSTR LPCfilename = tempf.c_str();

    MoveFile(LPCdirectory, LPCfilename);
}
4

2 回答 2

4

每个文件系统目录都包含“.”条目,表示同一目录,“..”表示父目录。在这种情况下,FindFirstFile返回“。” 第一的。您需要继续调用FindNextFile,直到找到您的 .txt 文件。

像这样的东西:

hFind = FindFirstFile(LPCdirectory, &data);
if (hFind != INVALID_HANDLE_VALUE)
{
    do
    {
        if (((data.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) &&
            (lstrcmpi(data.cFileName, _T("file.txt")))
        {
            // do something with the file...
            break;
        }
    }
    while (FindNextFile(hFind, &data));
    FindClose(hFind);
}
于 2013-04-28T00:21:02.950 回答
1

正如 Michael Liu 所说,您没有考虑到每个目录都有隐藏目录...子目录。您正在进行通配符搜索,因此搜索结果将包括这些子目录。您需要在循环时忽略它们,例如:

string directory;
string fullpathtofile;

for(unsigned int i = 0; I < password.length(); ++i)
{
    directory += (password[password.length()-i-1] + "\\");
}

WIN32_FIND_DATAA data = {0};
HANDLE hFind = FindFirstFileA((directory + "*").c_str(), &data);
if (hFind != INVALID_HANDLE_VALUE)
{
    do
    {
        if ((data.dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
        {
            fullpathtofile = directory + data.cFilename;
            break;
        }
    }
    while (FindNextFile(hFind, &data));
    FindClose(hFind);
}

if (!fullpathtofile.empty())
{
    // use fullpathtofile as needed ...
    // delete directory ...
}

另一方面,如果您已经提前知道完整的目录和文件名,则根本不需要循环FindFirstFile()。只需搜索没有任何通配符的完整文件路径,搜索将成功或失败,例如:

string directory;

for(unsigned int i = 0; I < password.length(); ++i)
{
    directory += (password[password.length()-i-1] + "\\");
}

string fullpathtofile = directory + "file.txt";

WIN32_FIND_DATAA data = {0};
HANDLE hFind = FindFirstFileA(fullpathtofile.c_str(), &data);
if (hFind != INVALID_HANDLE_VALUE)
{
    FindClose(hFind);

    // use data if needed...

    // use fullpathtofile as needed ...
    // delete directory ...
}

通配符搜索仅在您事先不知道文件名或目录中有多个文件时才有意义。

于 2013-04-28T06:02:21.883 回答