WIN32APIでディレクトリかどうか調べる方法
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGWIN32_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になっているというのはどうやって
調べるのでしょうか・・・
書き込むときは|でつなげばいいとはわかるのですが・・
0003デフォルトの名無しさん
NGNGif(dword & FILE_ATTRIBUTE_HIDDEN){
}
のif文に入る。
理由がわからなければ2進数とビット演算を勉強してくれ。
0004デフォルトの名無しさん
NGNGif((dword & FILE_ATTRIBUTE_DIRECTORY) == 0) directory = FALSE;
else directory = TRUE;
0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNG&でつなぐということはわかったのですが
4さんのとおりに
while (FindNextFile(fhandle@`&t)){
dword = GetFileAttributes(t.cFileName);
if (dword & FILE_ATTRIBUTE_DIRECTORY){
printf("ディレクトリ"@`dword);
}
printf("%s\n"@`t.cFileName);
}
としてみたのですが、
ファイルなのになぜかディレクトリだと表示されてしまうものが
あります。
これはなぜでしょうか?
0007デフォルトの名無しさん
NGNGfhandle =FindFirstFile("./*"@`&t);
を使うとディレクトリの判別はうまくいきますが
fhandle =FindFirstFile("./data/*"@`&t);
としてサブディレクトリにあるファイルの判別を行わせると
正しく判別されないようです。
なにか解決策はありますか?
お知恵をお貸しください。
0008デフォルトの名無しさん
NGNG#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
00098
NGNGCOMMAND
SYSTEM
SYSTEM32
の間違い。鬱だ氏脳。
00108
NGNGの間違いだった。あぁぁぁ。
0011デフォルトの名無しさん
NGNGこんなルールもろくに守れない厨房の質問にいちいち答えてどーすんの。
馬鹿が図に乗るだろ。sagesage
0012デフォルトの名無しさん
NGNG相当アホか?("./data/*.*"@`&t);
0013デフォルトの名無しさん
NGNGもしかしてやっちゃった?
もう一度じっくり考えてみて。
時間はたっぷりあるから。
0014デフォルトの名無しさん
NGNGMS の findfirst は腐ってるよ。いろいろと。標準に合わせるための
修正がいろいろ必要だったり。
0015第一感想
NGNG0016デフォルトの名無しさん
NGNG13はやさしいねえ。でもここは2ch。つっこめるときは突っ込んでおけ。
アホはおめーだ。Win32では"*"だけで動くんだよ!DOSの時代にかえれ。
0017西野妙子
NGNG0018デフォルトの名無しさん
NGNGBOOL 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>18
NGNG0020デフォルトの名無しさん
NGNG0021デフォルトの名無しさん
NGNGusing 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] );
}
}
}
■ このスレッドは過去ログ倉庫に格納されています