[PR]ネットとスマホ まとめておトク!

いつもお世話になっております。
今日はファイル検索についてお聞きしたいことがあります。
FindFirstFileを使ってフォルダ内のファイルを取得し、表示することを
目的とし、それはできたのですが、ファイルだけでなくフォルダも表示してしまいます。
「.」があるかないかで分別しようと思ったのですが
デバッガで見たところフォルダの最後にもなぜか「.」がついていたので
どのようにしたらいいか思いつきませんでした。
調べてみたのですが特定の拡張子を表示というものはありましたが
フォルダ以外のすべてのファイルを表示したいです。
いいアイデアがありましたらご教授願います。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

★過去質問より。


・サブフォルダを検索しない場合は
 http://oshiete1.goo.ne.jp/qa3220015.html→『あるディレクトリ内のファイルをファイル名でソートして取得』
・サブフォルダも検索する場合は
 http://oshiete1.goo.ne.jp/qa3230202.html→『デスクトップ上の全ファイル取得』
 という感じで行えます。
 両方見れば分かりますが次の1行でフォルダとファイルを分岐しています。
>if ( fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){
 ↑
 ここ。
 それから
 『.』は自分のディレクトリ・エントリ
 『..』は親のディレクトリ・エントリ
 を意味しています。
 ※あと過去質問やネット検索すると沢山の情報が見つかりますよ。
・以上。
    • good
    • 0
この回答へのお礼

サンプルページを教えていただきありがとうございます。
これからは自分で適したものを探せるようがんばります。

お礼日時:2008/02/05 22:38

ディレクトリを除くのであれば,WIN32_FIND_DATA::dwFileAttributesとFILE_ATTRIBUTE_DIRECTORYのANDをとって,それが0のもののみを表示するようにすればよいです。


ファイル名で判別するのは,対象にディレクトリを含む場合で,TEXT(".")またはTEXT("..")に完全に一致するかどうかの判定だけです。

ディレクトリでないフォルダはFindFirstFileでは出てこないので,上記の方法で全てのファイルを列挙することができます。
    • good
    • 0
この回答へのお礼

どうやってフォルダ名からはじくかを考えていたので
構造体の中にそういうものがあるとは思わず、
調査不足でした。
ご回答ありがとうございました。

お礼日時:2008/02/05 22:36

WIN32_FIND_DATA のメンバ: dwFileAttributes


で判別できます。マニュアル(MSDN)を読んでください。
    • good
    • 0
この回答へのお礼

どうやってフォルダ名からはじくかを考えていたので
構造体の中にそういうものがあるとは思わず、
調査不足でした。
ご回答ありがとうございました。

お礼日時:2008/02/05 22:36

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語にてプログラミングを行っていて、FindFirstFileにてフ

C言語にてプログラミングを行っていて、FindFirstFileにてファイル名を取得しようとしていますがうまくいきません。

第一引数に「D:\test\aaa*」と指定して、aaa01、aaa02、aaa03のようなファイル名が取得したいと考えています。

FindFirstFileの戻り値として、INVALID_HANDLE_VALUEがくるため目的の動作になりません。

上記のような事はできないのでしょうか?

いろいろ調べてみましたが解決できなくて質問させていただきました。

以上ですが、よろしくお願いいたします。

Aベストアンサー

バカにしているようで申し訳ないですがもう一度設定周りを見直してみてはいかがてしょう?
良くあるケースだと。
1. INIに記述したPATHが間違えてる
2. INIからPATHを取得できてない
3. ほんとに存在しない。
ですね。

1.と2.については、INIから取得したPATHを printf() 等にて出力して
その出力されたPATHを dir コマンドに渡してあげるコトで確認できると思います。
手入力じゃなくてコピペするようにしてください。

あとINIに指定したものを取得してFileFindFirstにわたすのなら\のエスケープは不要です。
エスケープはコンパイラの都合ですから。。
1.2.3.やってもだめなら、他の回答にあるように GetLastErrorから終了の原因を突き止めるしかありませんね。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QFindFirstFileについて教えてください。

Visual Studio C++ 2010 Expressを利用して、C言語のプログラムを作成しています。
その中でFindFirstFileを使っています。
Visual Studio上でWin32コンソールアプリのプロジェクトを作成して、このプログラムをコンパイルしました。
プロジェクトのプロパティは変更していません。
コンパイルしたものを実行すると戻り値としてINVALID_HANDLE_VALUEが返ってきて、ファイルのリストを取得できませんでした。

一方で、コマンドプロンプト上でMakefileを作成し、同じソースをコンパイルした場合は、ファイルのリストを正常に取得することが出来ます。
従いまして、おそらくプログラムは問題ないと思います。

Visual Studioのプロジェクトで、何かプロパティの設定が必要でしょうか?

実行環境は、Windows7 64-bitです。

何かご存知の方いらっしゃいましたら、教えて頂けますか?

Aベストアンサー

>FindFirstFileに指定した引数の文字列は、"C:\\Temp\\*.avi"などです。

なんというか、お約束ですが…
VC++2010EEでの文字セットは何になっていますか?

デフォルトのままだと「UNICODE文字セットを使用する」になっているかと思われますが。
# で…そのまんま"C:\\Temp\\*.avi"の指定だと警告かエラーかになるかと……。

Qデスクトップ上の全ファイル取得

開発環境
WindowsXP,SP2
Visual Studio 2005
VC++ SDK

SHGetFolderPath()でデスクトップのパスを取得した後、FindFirstFileによってデスクトップ上の全ファイル及びディレクトリの名前を取得したいと考えております。
SHGetFolderPathで取得したパスは、
C:\Documents and Settings\...\デスクトップ
となっており、この文字列をwsprintfで次のように加工しました。
wsprintf(output,"%s\\*.*","C:\Documents and Settings\...\デスクトップ");
このoutputをFindFirstFile,FindNextFile,FindCloseを組み合わせたプログラムでディレクトリ内の全てのファイル及びディレクトリの名前を取得しています。

このプログラムは普通(?)のディレクトリでは有効で、こちらの期待通りの動きをしてくれるのですが、取得したデスクトップのパスを渡すと、デスクトップフォルダ内にはデスクトップという名前のフォルダしかないと出力されます。以下のような感じです。

調査ディレクトリ:C:\Documents and Settings\...\デスクトップ
調査結果
"C:\Documents and Settings\...\デスクトップ"ディレクトリ内のファイル及びディレクトリ:デスクトップ

これはWindowsの仕様の動作なのでしょうか。
特殊フォルダであるデスクトップは、FindFirstFileでは調査出来ないのでしょうか?
他に方法はありますか?

どうか教えてください。

開発環境
WindowsXP,SP2
Visual Studio 2005
VC++ SDK

SHGetFolderPath()でデスクトップのパスを取得した後、FindFirstFileによってデスクトップ上の全ファイル及びディレクトリの名前を取得したいと考えております。
SHGetFolderPathで取得したパスは、
C:\Documents and Settings\...\デスクトップ
となっており、この文字列をwsprintfで次のように加工しました。
wsprintf(output,"%s\\*.*","C:\Documents and Settings\...\デスクトップ");
このoutputをFindFirstFile,FindNextFile,FindCloseを組...続きを読む

Aベストアンサー

★追記。
・ソースを見たら再帰処理になっていなかったので書き直しました。

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

// 再帰的にディレクトリを検索
VOID FuncListSubdir( LPTSTR lpPath )
{
 // カウンタ変数
 static TCHAR szLine[ 512 ];
 static DWORD dwDeep = 0;
 static DWORD dwFiles;
 static DWORD dwSubdir;
 // 宣言
 WIN32_FIND_DATA fdFile;
 HANDLE hFind;
 LPTSTR lpWild;
 
 // ディレクトリの表示
 if ( dwDeep == 0 ){
  printf( "★%s\n", lpPath );
 }
 else{
  printf( "%s\n", szLine );
  printf( "%.*s├◆%s\n", (lstrlen(szLine) - 2), szLine, PathFindFileName(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 ){
     lstrcpy( lpWild, fdFile.cFileName );
     lstrcat( szLine, TEXT("│") );
     dwDeep++;
     FuncListSubdir( lpPath );
     dwDeep--;
     szLine[ lstrlen(szLine) - 2 ] = '\0';
     dwSubdir++;
    }
    else{
     printf( "%s├%s\n", szLine, fdFile.cFileName );
     dwFiles++;
    }
   }
  } while ( FindNextFile(hFind,&fdFile) );
  
  FindClose( hFind );
 }
 lpWild[ -1 ] = '\0';
 
 // 結果表示
 if ( dwDeep == 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;
}
以上。

★追記。
・ソースを見たら再帰処理になっていなかったので書き直しました。

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

// 再帰的にディレクトリを検索
VOID FuncListSubdir( LPTSTR lpPath )
{
 // カウンタ変数
 static TCHAR szLine[ 512 ];
 static DWORD dwDeep = 0;
 static DWORD dwFiles;
 static DWORD dwSubdir;
 // 宣言
 WIN32_FIND_DATA fdFile;
 HANDLE hFind;
 LPTSTR lpWild;
 
 // ディレクトリの表示
 if ( dwDeep == 0 ){...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QLPCWSTRとchar

質問なのです・・・

現在、私は[Visual Stdio.Net 2005]を使って、C++のプログラミングをしようと思いまして、今日参考書を見てやってみたのですが、

charの配列を使って、文字列を格納しそれを使おうとしたら、LPCWSTRのキャストが必要というエラーがでました。
参考書だと普通に通るらしいのですが・・・Visual Stdio.Net 2003と2005の違いなのでしょか?わかる方教えていただけませんでしょうか??

Aベストアンサー

補足です。
2005デフォルトのUNICODEを変更する方法は
プロジェクト->プロパティ->構成プロパティ->全般 の中にある
文字セットを[Unicode 文字セットを使用する]から[マルチバイト文字セットを使用する]
に変更することで可能です。

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}

Qfatal error LNK1120: 外部参照 1 が未解決です

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
  char tel[20];
  char address[20];
};

void message( void );
void input( FILE *fp, int cnt , struct meibo *a, int *end );

void main( void )
{
  struct meibo a[20];
  FILE *fp;
  int cnt, end;

  if( (fp=fopen( "meibo.dat", "w" ) ) == NULL ){
    printf( "Can not open the meibo.dat.\n" );
    exit( 1 );
  }

  message();

  fprintf( fp, "番号, 名前, TEL, 住所\n" );
  fflush( fp );

  cnt = 0;
  end = 0;
  while( end == 0 ){
    input( fp, cnt, &a[cnt], &end );
    cnt++;
    fflush( fp );
    if( cnt == 20 ){
      printf( "人数が一杯です.終了します.\n" );
      end = 1;
    }
  }
  fclose( fp );
}

void message( void )
{
  printf( "名前, TEL, 住所, endを入力してください.\n" );
  printf( "継続の時はend=0," );
  printf( "中止の時は,end=1と入力してください.\n" );
}

void input( FILE *fp, int cnt, struct meibo *a, int *end )
{
  printf( "名前-->" );
  scanf( "%s", a->name );
  printf( "TEL -->" );
  scanf( "%s", a->tel );
  printf( "住所-->" );
  scanf( "%s", a->address );
  printf( "Exit? Continue:0 Exit:1 -->" );
  scanf( "%d", end );
  printf( "\n" );
  fprintf( fp, "%2d, %s, %s, %s\n",
    cnt+1, a->name, a->tel, a->address );
}

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
...続きを読む

Aベストアンサー

http://www.a.math.ryukoku.ac.jp/~hig/course/compsci2_2005/man/faq.html
にある現象と同じではないでしょうか、一度お試しください。

Qファイル名のリスト取得について

windowsで任意のフォルダにあるファイル名のリストを取得する方法を教えて下さい。

例えば*.ecdのファイルリストを取得するとします。

よろしくお願いします

Aベストアンサー

> windowsのAPI等使わずに標準関数等で出来ればと考えていますが無理でしょうか

無理です。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。


人気Q&Aランキング

おすすめ情報