请教:怎样过滤文件名?

时间:2022-12-29 15:33:19
在一个特定文件夹下(比如Courseware)有些FLASH和WMV等文件,Courseware下还有一些文件夹(这些文件夹作为一个文件对待,不考虑文件夹里面的其它文件),所有的文件/文件夹名称均类似于2-1-3.swf、3-2-3.mwv、4-3-5.doc等,文件夹名称类似于10-1-3、7-2-4等,问题是该如何在ListView中按行显示其中的某个或某些特定文件/文件夹的名称(例如:当我在TreeView中选择一个结点后,要求在ListView中显示最高位数字为1至10,且次高位数字为1的所有文件/文件夹的名称,则在ListView中就应显示2-1-3.swf和10-1-3。提醒:对于所有文件/文件夹的名称只有最高位和次高位的数字如“2-1-3.swf”中的“2”和“1”,“7-2-4”中的“7”和“2”才是“检索位”。只能利用检索位的数字进行文件名过滤)。

7 个解决方案

#1


对于

A-B-C.ext

是不是 A 是最高位,B 是次高位……

#2


简单一点,判断文件名是否是以 1-1、2-1、3-1、……、9-1、10-1 开头,即:

AnsiString file = ".....";

bool check = false;

for(int i=1;i<=10;i++) 
if( !check && file.Pos(IntToStr(i)+"-1") == 1 ) {
    check = true;
}

if( check == true ) {
//符合要求
}

#3


另外一种办法,将文件名根据 - 符号分开,判断 - 号前是否为高位是否为 1-10,次高位是否为 1,即:

TStringList *list = new TStringList();

AnsiString file = "........";

list->Delimiter = '-';
list->DelimitedText = file;
if( list->Count > 3 && //由于文件名中有两个 - 号,所以应该分隔成三个部份
    list->Strings[0].ToIntDef(-1) >= 1 && //高位
    list->Strings[0].ToIntDef(-1) <= 10 &&
    list->Strings[1].ToIntDef(-1) == 1 ) {//次高位
    //符合要求
}

delete list;

#4


对头。

#5


非常感谢楼上的赐教,我还想请教一个问题,就是如何给上述的程序中的那个“file”赋上具体的文件名。比如在“..\Courseware\”下有些上述格式的多媒体文件,当程序要求显示文件名时,首先遍历Courseware目录下所有的文件和文件夹的名称,然后将符合要求的所有文件名显示在ListView中,如何实现取得Courseware目录下所有文件/文件夹的名称这一过程?
在获取文件的名称时有没有诸如GetFileName(..\\Courseware\*.*)——当然这是我猜想的取得文件名的函数——然后返回AnsiString格式的文件名的函数? 
再次感谢.

#6


查这几个函数

FindFirst
FindNext
FindClose


int FountainSearchAllFiles(AnsiString FileName, TStringList *FStringList, bool FPath, bool FFullPath)
//功能:搜索文件
//参数:
//      FileName    - 文件类型(可含 * ?)
//      FStringList - 存放搜索结果
//      FPath       - 包含目录名
//      FFullPath   - 搜索到的文件名是否包含文件所在目录
//返回值:搜索到的项数
{
    AnsiString  sFindFile = FileName;
    AnsiString  sFilePath = ExtractFilePath(FileName.Trim());
    if( sFilePath == "" )   sFilePath = GetCurrentDir();
    AnsiString  sCurrentPath = GetCurrentDir();
try{
    TSearchRec  sr;
    if( sFilePath != "" )
        SetCurrentDir(sFilePath);
    int iAttributes;
//search paths
if( FPath )
    {
    iAttributes = 0;
    iAttributes |= faReadOnly * true;
    iAttributes |= faHidden * true;
    iAttributes |= faSysFile * true;
    iAttributes |= faVolumeID * true;
    iAttributes |= faDirectory * true;
    iAttributes |= faArchive * true;
    iAttributes |= faAnyFile * true;
    int iFind = FindFirst("*.*", iAttributes, sr);
//    int iFind = FindFirst(sFileName.Trim().c_str(), iAttributes, sr);
    while(  iFind == 0
        &&  (
//            sr.Name == "."
//            || sr.Name == ".."
//            ||
            (sr.Attr & faDirectory) == faDirectory
            )
        )
        {
        FStringList->Add(FFullPath ? sFilePath + sr.Name : sr.Name);
        iFind = FindNext(sr);
        }
    FindClose(sr);
    }
//Search files
    iAttributes = 0;
    iAttributes |= faReadOnly * true;
    iAttributes |= faHidden * true;
    iAttributes |= faSysFile * true;
    iAttributes |= faVolumeID * true;
    iAttributes |= faDirectory * true;
    iAttributes |= faArchive * true;
    iAttributes |= faAnyFile * true;
    int iFind = FindFirst(FileName.Trim().c_str(), iAttributes, sr);
    while( iFind == 0 )
        {
        if  (
            sr.Name != "."
            && sr.Name != ".."
            && (sr.Attr & faDirectory) != faDirectory
            )
            {
            FStringList->Add(FFullPath ? sFilePath + sr.Name : sr.Name);
//            FStringList->Add(sr.Name);
            }
        iFind = FindNext(sr);
        }
    FindClose(sr);

    SetCurrentDir(sCurrentPath);
    return(FStringList->Count);
    }//try
catch(...)
    {
    SetCurrentDir(sCurrentPath);
    return(FStringList->Count);
    }
}
//---------------------------------------------------------------------------

#7


一个字:高 !

#1


对于

A-B-C.ext

是不是 A 是最高位,B 是次高位……

#2


简单一点,判断文件名是否是以 1-1、2-1、3-1、……、9-1、10-1 开头,即:

AnsiString file = ".....";

bool check = false;

for(int i=1;i<=10;i++) 
if( !check && file.Pos(IntToStr(i)+"-1") == 1 ) {
    check = true;
}

if( check == true ) {
//符合要求
}

#3


另外一种办法,将文件名根据 - 符号分开,判断 - 号前是否为高位是否为 1-10,次高位是否为 1,即:

TStringList *list = new TStringList();

AnsiString file = "........";

list->Delimiter = '-';
list->DelimitedText = file;
if( list->Count > 3 && //由于文件名中有两个 - 号,所以应该分隔成三个部份
    list->Strings[0].ToIntDef(-1) >= 1 && //高位
    list->Strings[0].ToIntDef(-1) <= 10 &&
    list->Strings[1].ToIntDef(-1) == 1 ) {//次高位
    //符合要求
}

delete list;

#4


对头。

#5


非常感谢楼上的赐教,我还想请教一个问题,就是如何给上述的程序中的那个“file”赋上具体的文件名。比如在“..\Courseware\”下有些上述格式的多媒体文件,当程序要求显示文件名时,首先遍历Courseware目录下所有的文件和文件夹的名称,然后将符合要求的所有文件名显示在ListView中,如何实现取得Courseware目录下所有文件/文件夹的名称这一过程?
在获取文件的名称时有没有诸如GetFileName(..\\Courseware\*.*)——当然这是我猜想的取得文件名的函数——然后返回AnsiString格式的文件名的函数? 
再次感谢.

#6


查这几个函数

FindFirst
FindNext
FindClose


int FountainSearchAllFiles(AnsiString FileName, TStringList *FStringList, bool FPath, bool FFullPath)
//功能:搜索文件
//参数:
//      FileName    - 文件类型(可含 * ?)
//      FStringList - 存放搜索结果
//      FPath       - 包含目录名
//      FFullPath   - 搜索到的文件名是否包含文件所在目录
//返回值:搜索到的项数
{
    AnsiString  sFindFile = FileName;
    AnsiString  sFilePath = ExtractFilePath(FileName.Trim());
    if( sFilePath == "" )   sFilePath = GetCurrentDir();
    AnsiString  sCurrentPath = GetCurrentDir();
try{
    TSearchRec  sr;
    if( sFilePath != "" )
        SetCurrentDir(sFilePath);
    int iAttributes;
//search paths
if( FPath )
    {
    iAttributes = 0;
    iAttributes |= faReadOnly * true;
    iAttributes |= faHidden * true;
    iAttributes |= faSysFile * true;
    iAttributes |= faVolumeID * true;
    iAttributes |= faDirectory * true;
    iAttributes |= faArchive * true;
    iAttributes |= faAnyFile * true;
    int iFind = FindFirst("*.*", iAttributes, sr);
//    int iFind = FindFirst(sFileName.Trim().c_str(), iAttributes, sr);
    while(  iFind == 0
        &&  (
//            sr.Name == "."
//            || sr.Name == ".."
//            ||
            (sr.Attr & faDirectory) == faDirectory
            )
        )
        {
        FStringList->Add(FFullPath ? sFilePath + sr.Name : sr.Name);
        iFind = FindNext(sr);
        }
    FindClose(sr);
    }
//Search files
    iAttributes = 0;
    iAttributes |= faReadOnly * true;
    iAttributes |= faHidden * true;
    iAttributes |= faSysFile * true;
    iAttributes |= faVolumeID * true;
    iAttributes |= faDirectory * true;
    iAttributes |= faArchive * true;
    iAttributes |= faAnyFile * true;
    int iFind = FindFirst(FileName.Trim().c_str(), iAttributes, sr);
    while( iFind == 0 )
        {
        if  (
            sr.Name != "."
            && sr.Name != ".."
            && (sr.Attr & faDirectory) != faDirectory
            )
            {
            FStringList->Add(FFullPath ? sFilePath + sr.Name : sr.Name);
//            FStringList->Add(sr.Name);
            }
        iFind = FindNext(sr);
        }
    FindClose(sr);

    SetCurrentDir(sCurrentPath);
    return(FStringList->Count);
    }//try
catch(...)
    {
    SetCurrentDir(sCurrentPath);
    return(FStringList->Count);
    }
}
//---------------------------------------------------------------------------

#7


一个字:高 !