【问题标题】:Sort files according to creation date?根据创建日期对文件进行排序?
【发布时间】:2015-05-05 03:31:27
【问题描述】:

第一个问题解决了。文件排列整齐。

for (int i = 0; i < allFiles.GetSize(); i++)
{
    box1.AddString(allFiles[i]);
}

vector<file> files;

vector<tstring> vec;
vec.insert(vec.begin(), &allFiles[0], &allFiles[allFiles.GetSize() - 1] + 1);

transform(vec.begin(), vec.end(),back_inserter(files),[](wstring const &fname)
{
    WIN32_FIND_DATA d;
    HANDLE h = FindFirstFile(fname.c_str(), &d);
    FindClose(h);
    return d;
}

);

sort(files.begin(), files.end());
CStringArray sortFiles;
files.insert(files.begin(), &sortFiles[0], &sortFiles[sortFiles.GetSize() - 1] + 1);

现在的问题是我如何在 CStringArray 中保存排序文件。 Last Statement 显示错误见 cmets?

【问题讨论】:

    标签: c++ visual-studio-2013 mfc


    【解决方案1】:

    我愿意:

    1. 创建一个类型来保存文件名和时间戳。
    2. 使用FindFirstFile 获取您关心的每个文件的时间戳。
    3. 创建名称/时间戳对象并将其存储到向量中。
    4. 请致电FindClose 获取该文件。
    5. 对每个输入文件名从 2 开始重复。
    6. 按时间戳对向量进行排序。
    7. 显示结果。

    因此,一种可能的实现可能如下所示:

    #include <iostream>
    #include <Windows.h>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <iomanip>
    
    class file {
        std::string name;
        FILETIME time;
    public:
        bool operator<(file const &other) const { 
            return CompareFileTime(&time, &other.time) == 1;
        }
    
        friend std::ostream &operator<<(std::ostream &os, file const &f) {
            SYSTEMTIME st;
            FileTimeToSystemTime(&f.time, &st);
            return os << std::setw(20) << f.name << "\t" << st.wHour << ":" << st.wMinute << ":" << st.wSecond << " " << st.wYear << "/" << st.wMonth << "/" << st.wDay;
        }
    
        file(WIN32_FIND_DATA const &d) : name(d.cFileName), time(d.ftCreationTime) {}
    };
    
    int main(){ 
        std::vector<std::string> inputs{ "a.txt", "b.txt" };
    
        std::vector<file> files;
    
        std::transform(inputs.begin(), inputs.end(), 
            std::back_inserter(files),
            [](std::string const &fname) {
                WIN32_FIND_DATA d;
                HANDLE h = FindFirstFile(fname.c_str(), &d);
                FindClose(h);
                return d;
            }
        );
    
        std::sort(files.begin(), files.end());
        std::copy(files.begin(),files.end(),
            std::ostream_iterator<file>(std::cout, "\n"));
    }
    

    要处理文件名的“宽”(Unicode)字符串,您需要(稍微)修改为如下所示:

    #include <iostream>
    #include <Windows.h>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <iomanip>
    
    class file {
        std::wstring name;
        FILETIME time;
    public:
        bool operator<(file const &other) const { 
            return CompareFileTime(&time, &other.time) == 1;
        }
    
        friend std::wostream &operator<<(std::wostream &os, file const &f) {
            SYSTEMTIME st;
            FileTimeToSystemTime(&f.time, &st);
            return os << std::setw(20) << f.name << L"\t" << st.wHour << L":" << st.wMinute << L":" << st.wSecond << L" " << st.wYear << L"/" << st.wMonth << L"/" << st.wDay;
        }
    
        file(WIN32_FIND_DATA const &d) : name(d.cFileName), time(d.ftCreationTime) {}
    };
    
    int main(){ 
        std::vector<std::wstring> inputs{ L"a.txt", L"b.txt" };
    
        std::vector<file> files;
    
        std::transform(inputs.begin(), inputs.end(), 
            std::back_inserter(files),
            [](std::wstring const &fname) {
                WIN32_FIND_DATA d;
                HANDLE h = FindFirstFile(fname.c_str(), &d);
                FindClose(h);
                return d;
            }
        );
    
        std::sort(files.begin(), files.end());
        for (auto const &f : files)
            std::wcout << f << L"\n";
    }
    

    然后,当您构建它时,您需要通过在编译时定义 UNICODE 来告诉编译器您想要 Windows 函数的 Unicode 版本:

    cl -DUNICODE files.cpp
    

    【讨论】:

    • Jerry Coffin 在过去的 6 天里我一直在尝试这样做。我尝试了很多东西。请帮我这样做?
    • @andy:你在哪方面需要帮助?
    • 先生,我把文件夹路径或所有文件放在哪里?
    • @andy:main 中的inputs 向量包含要列出的文件的名称。
    • 错误。 1 IntelliSense:没有构造函数实例“std::basic_string<_elem _traits _alloc>::basic_string [with _Elem=char, _Traits=std::char_traits, _Alloc=std::allocator]”匹配参数列表参数类型为: (const WCHAR [260]) c:\Users\Administrator\Desktop\2015.5.5\Keep Recent\Try to make Full\Still Doing 1\File Remover Test 11\File Remover Test 11\Search .h 102 39 文件删除器测试 11
    【解决方案2】:

    根据创建日期或上次写入日期对文件进行排序的简单方法是将文件存储到映射中,其中键是日期,值是文件名。地图将为您排序..我的代码示例如下..

    BOOL GetLastWriteTime(FILETIME ftWrite, LPWSTR lpszString, DWORD dwSize)
    {
         DWORD dwRet;
         SYSTEMTIME st, stLocal;
        // Convert the last-write time to local time.
        FileTimeToSystemTime(&ftWrite, &st);
        SystemTimeToTzSpecificLocalTime(NULL, &st, &stLocal);
    
        // Build a string showing the date and time.
        dwRet = StringCchPrintf(lpszString, dwSize, 
            TEXT("%02d%02d%d%02d%02d%02d%04d"),
            stLocal.wMonth, stLocal.wDay, stLocal.wYear,
            stLocal.wHour, stLocal.wMinute, stLocal.wSecond, stLocal.wMilliseconds);
    
        if( S_OK == dwRet )
            return TRUE;
        else return FALSE;
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        std::map<wstring, wstring> first;
    
         wstring directory = L"D:\\SourceCode\\FilesTemp\\*";
         std::wstring name;
         WCHAR szBuf[MAX_PATH];
         WIN32_FIND_DATA d;
         HANDLE hFindFile   = FindFirstFile ( directory.c_str(), &d );
    
         if (hFindFile == INVALID_HANDLE_VALUE) 
        {
            DWORD dwLastError = ::GetLastError();
    
            if( dwLastError != ERROR_NO_MORE_FILES &&
                dwLastError != ERROR_FILE_NOT_FOUND)
            {
                return FALSE;
            }
    
            // No files found
            return TRUE;
        }
         do
         {
             if( d.cFileName[0] &&  _tcscmp( d.cFileName, _T( "." )) != 0 &&_tcscmp( d.cFileName, _T( ".." )) != 0 )
             {
                 name = d.cFileName;
                 if(GetLastWriteTime( d.ftLastWriteTime, szBuf, MAX_PATH ))
                 {
                    _tprintf(TEXT("Last write time is: %s\n"), szBuf);
                    first[szBuf] = name;
                 }
             }
         }while (FindNextFile ( hFindFile, &d ));
    
        return 0;
    }
    

    【讨论】:

    • 如果两个文件的日期相同,这不会失败吗?
    • 我试图使用此代码,但它给了我 [C++ 错误] Unit1.cpp(39): E2303 Type name expected 并且如果我使用 StringCchPrintf 或 sprintf 不允许我将它们用于[C++ 错误] Unit1.cpp(31): E2268 Call to undefined function 'sprintf'....
    猜你喜欢
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多