文件名排序

yuhui654975515 2017-12-06 01:02:29
文件夹里有n个这样的文件
201711241059_0.txt,
201711242014_0.txt
201711201020_0.txt
请问怎么按文件名排序取到最新的那个文件


...全文
405 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
山外客 2017-12-12
  • 打赏
  • 举报
回复

files = os.listdir('.')
results = reversed(sorted(files))
for i in results:
    print i
import os
赵4老师 2017-12-07
  • 打赏
  • 举报
回复
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE); C:\>dir /? 显示目录中的文件和子目录列表。 DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N] [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4] [drive:][path][filename] 指定要列出的驱动器、目录和/或文件。 /A 显示具有指定属性的文件。 attributes D 目录 R 只读文件 H 隐藏文件 A 准备存档的文件 S 系统文件 - 表示“否”的前缀 /B 使用空格式(没有标题信息或摘要)。 /C 在文件大小中显示千位数分隔符。这是默认值。用 /-C 来 禁用分隔符显示。 /D 跟宽式相同,但文件是按栏分类列出的。 /L 用小写。 /N 新的长列表格式,其中文件名在最右边。 /O 用分类顺序列出文件。 sortorder N 按名称(字母顺序) S 按大小(从小到大) E 按扩展名(字母顺序) D 按日期/时间(从先到后) G 组目录优先 - 反转顺序的前缀 /P 在每个信息屏幕后暂停。 /Q 显示文件所有者。 /S 显示指定目录和所有子目录中的文件。 /T 控制显示或用来分类的时间字符域。 timefield C 创建时间 A 上次访问时间 W 上次写入的时间 /W 用宽列表格式。 /X 显示为非 8.3 文件名产生的短名称。格式是 /N 的格式, 短名称插在长名称前面。如果没有短名称,在其位置则 显示空白。 /4 用四位数字显示年 可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号) 来替代预先设定的开关。例如,/-W。
yuhui654975515 2017-12-07
  • 打赏
  • 举报
回复
引用 19 楼 wodexiaojidan 的回复:
服了 你用map<subDir, vector<string>>同一个subDir下面,就直接排序vetor<string>就行了 直接sort(begin(), end())然后就是map[subDir].at(0) 完事
能给个demo吗
wodexiaojidan 2017-12-06
  • 打赏
  • 举报
回复
服了 你用map<subDir, vector<string>>同一个subDir下面,就直接排序vetor<string>就行了 直接sort(begin(), end())然后就是map[subDir].at(0) 完事
CT8100 2017-12-06
  • 打赏
  • 举报
回复
第一个数组只储存文件名称的前12位,最后可以取到日期最大值。 然后从储存完整名称的文件名的第二个数组与这12位数据比较memcmp(str[i],12位数据,12)==0 满足该条件的文件名就是你需要找的文件
LXL110306 2017-12-06
  • 打赏
  • 举报
回复
引用 16 楼 yuhui654975515 的回复:
[quote=引用 14 楼 iloveyou418 的回复:] [quote=引用 12 楼 yuhui654975515 的回复:] [quote=引用 1 楼 iloveyou418 的回复:]
vector<string> files;  
  
////获取该路径下的所有文件  
getFiles(filePath, files );  
  
char str[30];  
int size = files.size();  
for (int i = 0;i < size;i++)  
{  
    cout<<files[i].c_str()<<endl;  
}  
void getFiles( string path, vector<string>& files )  
{  
    //文件句柄  
    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;  
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    {  
        do  
        {  
            //如果是目录,迭代之  
            //如果不是,加入列表  
            if((fileinfo.attrib &  _A_SUBDIR))  
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
            }  
            else  
            {  
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
            }  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }  
}  
这样可以得到文件夹中的所有文件名称,然后你进行文件名判断就可以了, 头文件io.h
我现在疑惑的是我怎么判断这些文件在一个文件夹里做比较呢 因为我有很多个文件夹 每个文件夹里有很多个文件 我要拿到每个文件夹中名字最新的文件[/quote] 你要做的第一步是将这个文件夹中的文件名全部储存在数组中,这个上面的程序就能实现了,然后你只需要求这个数组中值最大的元素,这个元素就是你需要的文件名[/quote] 你可能没有看懂我的意思 做个例子:我有更文件夹里面包括子文件夹A,B,C 子文件夹A中包括 201711241059_1.txt, 201711242014_1.txt 201711201020_1.txt 子文件夹B中包括 201711241059_2.txt, 201711242014_2.txt 201711201020_2.txt 子文件夹C中包括 201711241059_3.txt, 201711242014_3.txt 201711201020_3.txt 然后我要拿到这ABC三个问价夹中最新的3个文件 201711242014_1.txt 201711242014_2.txt 201711242014_3.txt 而不是你的意思只有一个文件 201711242014_3.txt [/quote]你只要把上面的代码封成一个函数,然后每个文件夹调用一遍这个函数,不就能取到每个文件就爱最新的文件了吗?
yuhui654975515 2017-12-06
  • 打赏
  • 举报
回复
引用 14 楼 iloveyou418 的回复:
[quote=引用 12 楼 yuhui654975515 的回复:] [quote=引用 1 楼 iloveyou418 的回复:]
vector<string> files;  
  
////获取该路径下的所有文件  
getFiles(filePath, files );  
  
char str[30];  
int size = files.size();  
for (int i = 0;i < size;i++)  
{  
    cout<<files[i].c_str()<<endl;  
}  
void getFiles( string path, vector<string>& files )  
{  
    //文件句柄  
    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;  
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    {  
        do  
        {  
            //如果是目录,迭代之  
            //如果不是,加入列表  
            if((fileinfo.attrib &  _A_SUBDIR))  
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
            }  
            else  
            {  
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
            }  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }  
}  
这样可以得到文件夹中的所有文件名称,然后你进行文件名判断就可以了, 头文件io.h
我现在疑惑的是我怎么判断这些文件在一个文件夹里做比较呢 因为我有很多个文件夹 每个文件夹里有很多个文件 我要拿到每个文件夹中名字最新的文件[/quote] 你要做的第一步是将这个文件夹中的文件名全部储存在数组中,这个上面的程序就能实现了,然后你只需要求这个数组中值最大的元素,这个元素就是你需要的文件名[/quote] 你可能没有看懂我的意思 做个例子:我有更文件夹里面包括子文件夹A,B,C 子文件夹A中包括 201711241059_1.txt, 201711242014_1.txt 201711201020_1.txt 子文件夹B中包括 201711241059_2.txt, 201711242014_2.txt 201711201020_2.txt 子文件夹C中包括 201711241059_3.txt, 201711242014_3.txt 201711201020_3.txt 然后我要拿到这ABC三个问价夹中最新的3个文件 201711242014_1.txt 201711242014_2.txt 201711242014_3.txt 而不是你的意思只有一个文件 201711242014_3.txt
自信男孩 2017-12-06
  • 打赏
  • 举报
回复
引用 13 楼 yuhui654975515 的回复:
[quote=引用 11 楼 cfjtaishan 的回复:] 这个问题可以理解为若干个字符串中求最大字符串的问题。文件名作为字符串,通过字符串比较大小,得到最大字符串,最大字符串就是最新的文件名。
我现在理解这个比较法了 那我怎么判断我比较的这些字符串在一个文件夹里的文件呢。 [/quote] 那么这些文件名从哪个目录里得到的,能够知道吧。就是你先从目录里读文件,确定了目录,那么读到该目录下的文件都是同一目录下的。
CT8100 2017-12-06
  • 打赏
  • 举报
回复
引用 12 楼 yuhui654975515 的回复:
[quote=引用 1 楼 iloveyou418 的回复:]
vector<string> files;  
  
////获取该路径下的所有文件  
getFiles(filePath, files );  
  
char str[30];  
int size = files.size();  
for (int i = 0;i < size;i++)  
{  
    cout<<files[i].c_str()<<endl;  
}  
void getFiles( string path, vector<string>& files )  
{  
    //文件句柄  
    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;  
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    {  
        do  
        {  
            //如果是目录,迭代之  
            //如果不是,加入列表  
            if((fileinfo.attrib &  _A_SUBDIR))  
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
            }  
            else  
            {  
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
            }  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }  
}  
这样可以得到文件夹中的所有文件名称,然后你进行文件名判断就可以了, 头文件io.h
我现在疑惑的是我怎么判断这些文件在一个文件夹里做比较呢 因为我有很多个文件夹 每个文件夹里有很多个文件 我要拿到每个文件夹中名字最新的文件[/quote] 你要做的第一步是将这个文件夹中的文件名全部储存在数组中,这个上面的程序就能实现了,然后你只需要求这个数组中值最大的元素,这个元素就是你需要的文件名
yuhui654975515 2017-12-06
  • 打赏
  • 举报
回复
引用 11 楼 cfjtaishan 的回复:
这个问题可以理解为若干个字符串中求最大字符串的问题。文件名作为字符串,通过字符串比较大小,得到最大字符串,最大字符串就是最新的文件名。
我现在理解这个比较法了 那我怎么判断我比较的这些字符串在一个文件夹里的文件呢。
yuhui654975515 2017-12-06
  • 打赏
  • 举报
回复
引用 1 楼 iloveyou418 的回复:
vector<string> files;  
  
////获取该路径下的所有文件  
getFiles(filePath, files );  
  
char str[30];  
int size = files.size();  
for (int i = 0;i < size;i++)  
{  
    cout<<files[i].c_str()<<endl;  
}  
void getFiles( string path, vector<string>& files )  
{  
    //文件句柄  
    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;  
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    {  
        do  
        {  
            //如果是目录,迭代之  
            //如果不是,加入列表  
            if((fileinfo.attrib &  _A_SUBDIR))  
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
            }  
            else  
            {  
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
            }  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }  
}  
这样可以得到文件夹中的所有文件名称,然后你进行文件名判断就可以了, 头文件io.h
我现在疑惑的是我怎么判断这些文件在一个文件夹里做比较呢 因为我有很多个文件夹 每个文件夹里有很多个文件 我要拿到每个文件夹中名字最新的文件
自信男孩 2017-12-06
  • 打赏
  • 举报
回复
这个问题可以理解为若干个字符串中求最大字符串的问题。文件名作为字符串,通过字符串比较大小,得到最大字符串,最大字符串就是最新的文件名。
yuhui654975515 2017-12-06
  • 打赏
  • 举报
回复
引用 9 楼 ananluowei 的回复:
首先要获取文件夹下所有的文件名,这个需要借助操作系统提供的相应的API,存放在字符串数组或者string数组或者其他容器。 然后就是存粹的对字符串进行一些操作了。 很多实际应用都是对字符串进行一定的处理,所以处理字符串的各种方法要熟练掌握。 你的例子就是从字符串解析出年月日和_后的数字,比较年月日和_后面的数字即可。
我现在迷惑的是有很多个文件夹 每个文件夹下有很多个txt文件 我要怎么判断我比较的这个年月日时在一个文件夹里
大尾巴猫 2017-12-06
  • 打赏
  • 举报
回复
首先要获取文件夹下所有的文件名,这个需要借助操作系统提供的相应的API,存放在字符串数组或者string数组或者其他容器。 然后就是存粹的对字符串进行一些操作了。 很多实际应用都是对字符串进行一定的处理,所以处理字符串的各种方法要熟练掌握。 你的例子就是从字符串解析出年月日和_后的数字,比较年月日和_后面的数字即可。
wodexiaojidan 2017-12-06
  • 打赏
  • 举报
回复
C语言可以用strchr(filename, '_')来截取前面的时间串,然后qsort;C++直接用string.find()和string.substring()来获取时间串,然后sort()
wodexiaojidan 2017-12-06
  • 打赏
  • 举报
回复
sring.c_str(),用const char *接收
yuhui654975515 2017-12-06
  • 打赏
  • 举报
回复
引用 5 楼 iloveyou418 的回复:
[quote=引用 4 楼 yuhui654975515 的回复:] [quote=引用 3 楼 iloveyou418 的回复:] [quote=引用 2 楼 yuhui654975515 的回复:] [quote=引用 1 楼 iloveyou418 的回复:]
vector<string> files;  
  
////获取该路径下的所有文件  
getFiles(filePath, files );  
  
char str[30];  
int size = files.size();  
for (int i = 0;i < size;i++)  
{  
    cout<<files[i].c_str()<<endl;  
}  
void getFiles( string path, vector<string>& files )  
{  
    //文件句柄  
    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;  
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    {  
        do  
        {  
            //如果是目录,迭代之  
            //如果不是,加入列表  
            if((fileinfo.attrib &  _A_SUBDIR))  
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
            }  
            else  
            {  
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
            }  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }  
}  
这样可以得到文件夹中的所有文件名称,然后你进行文件名判断就可以了, 头文件io.h
我知道怎么得到文件名 我想知道怎么判断这个文件名 [/quote] 直接复制到char[]中然后strcmp比较大小,因为你这个是按照日期来取名字,strcmp是从第一个字符依次比较。。。大的那个自然是最新的。。。[/quote] 有没有类似的代码啊[/quote] 直接百度strcmp使用方法。。。超级多的代码。。。[/quote] 我的意思是怎么把上面的代码的出来的一个路径取到文件中的日期复制到char[]中
CT8100 2017-12-06
  • 打赏
  • 举报
回复
引用 4 楼 yuhui654975515 的回复:
[quote=引用 3 楼 iloveyou418 的回复:] [quote=引用 2 楼 yuhui654975515 的回复:] [quote=引用 1 楼 iloveyou418 的回复:]
vector<string> files;  
  
////获取该路径下的所有文件  
getFiles(filePath, files );  
  
char str[30];  
int size = files.size();  
for (int i = 0;i < size;i++)  
{  
    cout<<files[i].c_str()<<endl;  
}  
void getFiles( string path, vector<string>& files )  
{  
    //文件句柄  
    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;  
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    {  
        do  
        {  
            //如果是目录,迭代之  
            //如果不是,加入列表  
            if((fileinfo.attrib &  _A_SUBDIR))  
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
            }  
            else  
            {  
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
            }  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }  
}  
这样可以得到文件夹中的所有文件名称,然后你进行文件名判断就可以了, 头文件io.h
我知道怎么得到文件名 我想知道怎么判断这个文件名 [/quote] 直接复制到char[]中然后strcmp比较大小,因为你这个是按照日期来取名字,strcmp是从第一个字符依次比较。。。大的那个自然是最新的。。。[/quote] 有没有类似的代码啊[/quote] 直接百度strcmp使用方法。。。超级多的代码。。。
yuhui654975515 2017-12-06
  • 打赏
  • 举报
回复
引用 3 楼 iloveyou418 的回复:
[quote=引用 2 楼 yuhui654975515 的回复:] [quote=引用 1 楼 iloveyou418 的回复:]
vector<string> files;  
  
////获取该路径下的所有文件  
getFiles(filePath, files );  
  
char str[30];  
int size = files.size();  
for (int i = 0;i < size;i++)  
{  
    cout<<files[i].c_str()<<endl;  
}  
void getFiles( string path, vector<string>& files )  
{  
    //文件句柄  
    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;  
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    {  
        do  
        {  
            //如果是目录,迭代之  
            //如果不是,加入列表  
            if((fileinfo.attrib &  _A_SUBDIR))  
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
            }  
            else  
            {  
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
            }  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }  
}  
这样可以得到文件夹中的所有文件名称,然后你进行文件名判断就可以了, 头文件io.h
我知道怎么得到文件名 我想知道怎么判断这个文件名 [/quote] 直接复制到char[]中然后strcmp比较大小,因为你这个是按照日期来取名字,strcmp是从第一个字符依次比较。。。大的那个自然是最新的。。。[/quote] 有没有类似的代码啊
CT8100 2017-12-06
  • 打赏
  • 举报
回复
引用 2 楼 yuhui654975515 的回复:
[quote=引用 1 楼 iloveyou418 的回复:]
vector<string> files;  
  
////获取该路径下的所有文件  
getFiles(filePath, files );  
  
char str[30];  
int size = files.size();  
for (int i = 0;i < size;i++)  
{  
    cout<<files[i].c_str()<<endl;  
}  
void getFiles( string path, vector<string>& files )  
{  
    //文件句柄  
    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;  
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    {  
        do  
        {  
            //如果是目录,迭代之  
            //如果不是,加入列表  
            if((fileinfo.attrib &  _A_SUBDIR))  
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
            }  
            else  
            {  
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
            }  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }  
}  
这样可以得到文件夹中的所有文件名称,然后你进行文件名判断就可以了, 头文件io.h
我知道怎么得到文件名 我想知道怎么判断这个文件名 [/quote] 直接复制到char[]中然后strcmp比较大小,因为你这个是按照日期来取名字,strcmp是从第一个字符依次比较。。。大的那个自然是最新的。。。
加载更多回复(2)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧