トップページ⇒tech
21コメント7KB

WIN32APIでディレクトリかどうか調べる方法

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
WIN32APIでディレクトリかどうか調べる方法
WIN32_FIND_DATA t;
HANDLE fhandle;
FindFileFirst("/*"@`&t);
DWORD dword;
while (FindNextFile){
dword = GetFileAttributes
/ここで処理/
}
dwordになんらかの処理をすれば判明すると思うのでが、
dwordには32とか16とか-1とか
なっていてこれをどう解析すればいいのかよくわかりません。
MSDNを読む限りでは、
この数字は
FILE_ATTRIBUTE_ARCHIVE
FILE_ATTRIBUTE_COMPRESSED
FILE_ATTRIBUTE_DIRECTORY
FILE_ATTRIBUTE_HIDDEN
などの組み合わせだそうです。
どれがONになってどれがOFFになっているというのはどうやって
調べるのでしょうか・・・
書き込むときは|でつなげばいいとはわかるのですが・・
0002デフォルトの名無しさんNGNG
WinAPI相談室
http://piza.2ch.net/test/read.cgi?bbs=tech&key=973187725&ls=50
0003デフォルトの名無しさんNGNG
dwordがディレクトリなら
if(dword & FILE_ATTRIBUTE_HIDDEN){

}
のif文に入る。
理由がわからなければ2進数とビット演算を勉強してくれ。
0004デフォルトの名無しさんNGNG
>>1
if((dword & FILE_ATTRIBUTE_DIRECTORY) == 0) directory = FALSE;
else                      directory = TRUE;
0005デフォルトの名無しさんNGNG
PathIsDirectory()
0006デフォルトの名無しさんNGNG
みなさんありがとうございます。
&でつなぐということはわかったのですが
4さんのとおりに
while (FindNextFile(fhandle@`&t)){
dword = GetFileAttributes(t.cFileName);
if (dword & FILE_ATTRIBUTE_DIRECTORY){
printf("ディレクトリ"@`dword);
}
printf("%s\n"@`t.cFileName);
}
としてみたのですが、
ファイルなのになぜかディレクトリだと表示されてしまうものが
あります。
これはなぜでしょうか?
0007デフォルトの名無しさんNGNG
自己レスです。
fhandle =FindFirstFile("./*"@`&t);
を使うとディレクトリの判別はうまくいきますが
fhandle =FindFirstFile("./data/*"@`&t);
としてサブディレクトリにあるファイルの判別を行わせると
正しく判別されないようです。
なにか解決策はありますか?
お知恵をお貸しください。
0008デフォルトの名無しさんNGNG
/* findir.c */

#include <stdio.h>
#include <windows.h>

void print_only_directory(const char* p)
{
  WIN32_FIND_DATA data;
  HANDLE h = FindFirstFile(p@` &data);
  while(FindNextFile(h@` &data))
  {
    if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
      if(strcmp(data.cFileName@` "..") != 0)
      {
        printf("%s\n"@` data.cFileName);
      }
    }
  }
  FindClose(h);

}

void usage()
{
  printf("Usage: findir <FilePath\\>\n");
}

int main(int argc@` char* argv[])
{
  char p[MAX_PATH];
  if(argc != 2)
  {
    usage();
    return -1;
  }
  if(*(argv[1] + strlen(argv[1]) - 1) != '\\')
  {
    usage();
    return -1;
  }
 
  sprintf(p@` "%s*.*"@` argv[1]);
  print_only_directory(p);

  return 0;
}

/*------------------------------*/
C:\>findir c:\
WINDOWS

C:\>finder c:\windows
COMMAND
SYSTEM
SYSTEM32
00098NGNG
C:\>finder c:\windows\
COMMAND
SYSTEM
SYSTEM32

の間違い。鬱だ氏脳。
00108NGNG
C:\>findir c:\windows\
の間違いだった。あぁぁぁ。
0011デフォルトの名無しさんNGNG
お前らどうでもいいが優しすぎ。
こんなルールもろくに守れない厨房の質問にいちいち答えてどーすんの。
馬鹿が図に乗るだろ。sagesage
0012デフォルトの名無しさんNGNG
>fhandle =FindFirstFile("./data/*"@`&t);
相当アホか?("./data/*.*"@`&t);
0013デフォルトの名無しさんNGNG
>>12
もしかしてやっちゃった?
もう一度じっくり考えてみて。
時間はたっぷりあるから。
0014デフォルトの名無しさんNGNG
unix のとあわせてディレクトリサーチのコード書いたけど
MS の findfirst は腐ってるよ。いろいろと。標準に合わせるための
修正がいろいろ必要だったり。
0015第一感想NGNG
8の書き方は綺麗で萌える
0016デフォルトの名無しさんNGNG
>>12
13はやさしいねえ。でもここは2ch。つっこめるときは突っ込んでおけ。
アホはおめーだ。Win32では"*"だけで動くんだよ!DOSの時代にかえれ。
0017西野妙子NGNG
誰も覚えちゃいないさ。。どーせ。。(涙)
0018デフォルトの名無しさんNGNG
なんで5は無視されているの?
BOOL PathIsDirectory(LPCTSTR pszPath);
PathIsDirectory@`4.0 or later@`Windows 95 or later@`@`@`Shell@`@`shlwapi.h@`shlwapi.lib@`Implemented as Unicode and ANSI versions on Windows NT.@`function
0019>18NGNG
IE4.0以上だからじゃないの?
0020デフォルトの名無しさんNGNG
sage
0021デフォルトの名無しさんNGNG
C#だとこうね。リカーシブに表示するよ。

using System;
using System.IO;

public class program
{
public static void Main(string[] args)
{
Directory di;

if ( args.Length > 0 )
di = new Directory( args[0] );
else
di = new Directory( "." );
if ( ! di.Exists ) {
Console.WriteLine( "{0} is not a directory"@` di.FullName );
return;
}
Console.WriteLine( "{0}:"@` di.FullName );
DispDir( di );
}

static void DispDir( Directory parent ) {
Directory[] dirs;

dirs = parent.GetDirectories( );
for ( int i = 0; i < dirs.Length; i++ ) {
Console.WriteLine( "{0}"@` dirs[i].FullName );
DispDir( dirs[i] );
}
}
}
■ このスレッドは過去ログ倉庫に格納されています