プロが教える店舗&オフィスのセキュリティ対策術

_FindFirst や FindFirstFile を使用すると指定フォルダの
ファイル名を順番に取得できるのですが、ファイル名でソートされていません。

ファイル名でソートして取得する関数(API)はあるのでしょうか?

A 回答 (3件)

続き。



実行結果:
『FindFirstFile.exe C:』として実行した。
--------------------
◆C:
├1.ICO
├10.ICO
├11.ICO
├12.ICO
├<121ware>
├13.ICO
├14.ICO
├15.ICO
├16.ICO
├17.ICO
├18.ICO
├2.ICO
├3.ICO
├4.ICO
├5.ICO
├6.ICO
├7.ICO
├8.ICO
├9.ICO
├ACCESSP.DAT
├<Apache>
├<APSETUP>
├ASC_FONT.DAT
├AUTOEXEC.BAT
├<BACKUP>
├<BACKUP2>
├BASEINF.CFG
├BBS.MCR
├BEGIN.MCR
├BOOT.INI
├bootfont.bin
├BOX.MCR
├BROKE.ICO
├BUSINE.MCR
├BYE.ICO
├CCAT.BAT
├CLUB.MCR
├cmldr
├<Config.Msi>
├CONFIG.SYS
├COP.HLP
├COPER.BAT
├COPER.M01
├COPER.M02
├COPERE.EXE
├DB.MCR
├DEFAUL64.ICO
├DEFAULT.ICO
├<Desktop>
├DIAL.ICO
├Documents
├<Documents and Settings>
├<DOTNETFX>
├DSIGUP.MCR
├GATE.MCR
├GUIDE.MCR
├hiberfil.sys
├INFO1.ICO
├INFOS.MCR
├INFSALON.MCR
├INTERSIT.MCR
├INTRSITE.MCR
├IO.SYS
├JPDEC16.EXE
├JUMP.MCR
├<JUST>
├KANAGAWA.MCR
├KCOPER.M02
├KGYOSEI.MCR
├KLOGIN.MCR
├LOGIN.MCR
├MAIL.MCR
├MAIL.MEN
├MAIN1.MCR
├MAINTERM.MCR
├MMAIN.MCR
├MOWARI.MCR
├MSDOS.SYS
├MYEDIT.BAT
├<MyGame>
├NAPDEV.SYS
├navaデータ
├navaデータ2
├<Necread>
├NTDETECT.COM
├ntldr
├O.ICO
├OLG.MCR
├OLT.ICO
├OLT.MCR
├<OPTIONS>
├OSIRASE.MCR
├OWARI.MCR
├<OXPSP>
├<OXPSP1>
├<OXPSP2>
├pagefile.sys
├<PCP>
├PDOXUSRS.NET
├PRIVATE.CFG
├<Program Files>
├<PuCa.vol>
├QVAN.EXE
├RCVMAIL.MCR
├RCVMAIL0.MCR
├RCVMAIL1.MCR
├RCVMAIL2.MCR
├<RECYCLER>
├SAKUIN.CSV
├SAKUIN.MCR
├SALON.MCR
├SDELAY.DAT
├SETTEI.EXE
├SETUP.MCR
├SHOP.MCR
├SKENSAKU.MCR
├<Smdata>
├SNDMAIL.MCR
├SOKUHO.MCR
├<SUPPORT>
├<svrecord>
├<System Volume Information>
├<tanken>
├TITLE.ICO
├TITLE2.ICO
├TOKUSETU.MCR
├U.ICO
├Untitled.krm
├USER.MEN
├<VALUEADD>
├VCLS.COM
├VEXIT.COM
├VIEW.EXE
├VNAP.EXE
├VNAPDISP.EXE
├VOFF.COM
├VON.COM
├WELCOME.ICO
├WELTITLE.ICO
├WFDTREE.DAT
├<WINDOWS>
├<WINXP>
├<WUTemp>
├<yougo>
├受信.ICO
├接続.ICO
├未読一括.ICO
├未読表.ICO
├索引.ICO
├終了.ICO
├編集.ICO
├設定.ICO
├送信.ICO
├電掲.ICO
├ガイド1.ICO
├ガイド2.ICO
├ジャンプ.ICO
├ヨウコソ.ICO
├ライブラ.ICO

フォルダ数:30 個
ファイル数:129 個
--------------------
ほら。
ファイル名でソートされて表示されましたが…。
ソースを試して見て下さい。

もし上手くソートしない場合は、リスト構造の構造体に取得していき
自分でソートすれば良いだけですけど。
以上。
    • good
    • 0
この回答へのお礼

再度ありがとうございます。

結局自分でメモリ内で貯めていきソートするしかないようですね。

お礼日時:2007/08/03 01:04

★順番どおりに取得される?不思議。


>ファイル名でソートして取得する関数(API)はあるのでしょうか?
 ↑
 ありません。
>_FindFirst や FindFirstFile を使用すると指定フォルダの
 ↑
 この関数(_FindFirst)は処理系の独自関数ですよね。
 Win32 API では FindFirstFile() と FindNextFile() がペアですし。
 でも Win32 API で取得するとファイル名でソートされて取得されませんか?
 私の環境(Windows XP)ではファイル名でソートされて取得されますが…。
 下に確認用のソースを載せておきます。

サンプル関数:
#include <stdio.h>
#include <shlwapi.h>
#include <windows.h>

VOID FuncListSubdir( LPTSTR lpPath )
{
 // カウンタ変数
 DWORD dwSubdir = 0;
 DWORD dwFiles = 0;
 // 宣言
 WIN32_FIND_DATA fdFile;
 HANDLE hFind;
 LPTSTR lpWild;
 
 printf( "◆%s\n", lpPath );
 lpWild = PathAddBackslash( lpPath );
 lstrcpy( lpWild, TEXT("*.*") );
 
 if ( (hFind = FindFirstFile(lpPath,&fdFile)) != INVALID_HANDLE_VALUE ){
  do {
   if ( fdFile.cFileName[0] != '.' ){
    if ( fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){
     printf( "├<%s>\n", fdFile.cFileName );
     dwSubdir++;
    }
    else{
     printf( "├%s\n", fdFile.cFileName );
     dwFiles++;
    }
   }
  } while ( FindNextFile(hFind,&fdFile) );
  
  FindClose( hFind );
 }
 lpWild[ -1 ] = '\0';
 // 結果表示
 printf( "\n" );
 printf( "フォルダ数:%u 個\n", dwSubdir );
 printf( "ファイル数:%u 個\n", dwFiles );
}

// メイン関数
int main( int argc, char *argv[] )
{
 TCHAR szPath[ MAX_PATH ];
 
 if ( argc == 1 ){
  printf( "USAGE: FindFirstFile.exe <direct>\n" );
  return 1;
 }
 // 検索
 lstrcpy( szPath, argv[1] );
 FuncListSubdir( szPath );
 return 0;
}

続く。
    • good
    • 0
この回答へのお礼

ありがとうございます。

基本的にソートされているのですが、極一部のファイル(ディレクトリ)がソートされないで取得されます。
それにMSDNにはソートして取得すると明言されていないので、ファイル名でソートされなくても仕様ということになりますし・・・

このため明示的にソートができないか悩んでいます。

お礼日時:2007/08/03 01:02

 標準にはないと思います。


 そもそも何を元にソートすればいいのかという問題もありますし。
    • good
    • 0
この回答へのお礼

ありがとうございます。
なさそうですね。

お礼日時:2007/08/03 01:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A