- ベストアンサー
ディレクトリの属性の検出とディレクトリの作成
OSはWinodws xp ですが、 Win32でどうやって指定されてたディレクトリのReadOnlyの属性を検出しますか? また、どうやってReadOnlyのディレクトリを作りますか? 知っている方は教えていただけませんか?
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
>私が考えているのは、ReadOnlyのディレクトリの下にファイルと >サブディレクトリを作成できないようなことですが、 ディレクトリ属性で付与できるのは、もともと 「アプリケーションが操作する読み込み・書き込み処理」 とあるのでユーザ操作に対してはそもそも意味を成さないかと。 プログラム側でテストするには、CreateDirectoryなどを使った TPが必要になると思います。 ただ、テストプログラム作って試してみたのですが、 どうもディレクトリのファイル属性の変更を行っても、 ファイルの作成などはできるようです。。。 # 以下のKBが関係ありそうな、なさそうな。 # http://support.microsoft.com/kb/326549 >このソースで、ReadOnlyのディレクトリを判定できますか? >もしそれで検出できれなら、どうテストすると思われますか? 判断はできると思いますが、ディレクトリに対する属性操作が 無効にされてしまう可能性があるのでテストをするとなると 少なくともKBを見る限りではエクスプローラからの確認は 意味を成さないように思えます。。。 # テスト用のサービスとかを作ればできるかも。。。? ユーザ操作に対してフォルダ作成などの制限をかける場合、 フォルダ属性の制御よりはアクセスコントロールを 制御する方が確実だということだと思います。 プログラムが所属するアカウントグループの問題や 実行権限の問題が出てきて面倒ではありますが。。。 # これも通常実行権限のアプリケーションから # 行えるという保証はありませんが。。。 試したサンプル。 #include <windows.h> #include <stdio.h> int main(void) { DWORD dwRet; HANDLE hHandle; if ( !CreateDirectory( "hogehoge", NULL )) { printf( "CreateDirectory error:%d\n", GetLastError()); } // 期待しているのは 読み取り専用 : レ // 関数は成功するが、属性は 読み取り専用 : ■ となる if ( !SetFileAttributes( "hogehoge",FILE_ATTRIBUTE_READONLY ) ) { printf( "SetFileAttributes error:%d\n", GetLastError()); } dwRet = GetFileAttributes( "hogehoge" ); printf( "%x\n", dwRet ); printf( "FILE_ATTRIBUTE_DIRECTORY:%x\n",FILE_ATTRIBUTE_DIRECTORY ); printf( "FILE_ATTRIBUTE_READONLY:%x\n",FILE_ATTRIBUTE_READONLY ); // 読み取り専用属性にはなっているよう if ( dwRet & FILE_ATTRIBUTE_DIRECTORY && dwRet&FILE_ATTRIBUTE_READONLY ) { printf( "FILE_ATTRIBUTE_READONLY\n"); } else { printf( "Not FILE_ATTRIBUTE_READONLY\n"); } // でもファイルは作成できる hHandle = CreateFile( "hogehoge\\hugahuga.txt", GENERIC_ALL, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if ( hHandle == INVALID_HANDLE_VALUE ) { printf( "CreateFile error:%d\n", GetLastError()); return 2; } if ( !SetFileAttributes( "新しいフォルダ\\test.obj",FILE_ATTRIBUTE_READONLY ) ) { printf( "SetFileAttributes error:%d\n", GetLastError()); } CloseHandle( hHandle ); return 0; } #インデントは全角。
その他の回答 (9)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>今思ったのは、それは本当にReadOnlyでしょうか? フォルダに読み取り専用属性を付けても、フォルダの中身はリードオンリーではありません。 ファイルもサブディレクトリも作れてしまいます。 XPがそういう仕様になっていますから。 >私が考えているのは、ReadOnlyのディレクトリの下にファイルと >サブディレクトリを作成できないようなことですが、 それを実行するには、NTFSを使用し、アドミン特権を得てフォルダのアクセス権を変更すればどうにか出来るかも知れませんが「ファイルやフォルダの新規作成だけさせない」のは無理かも知れません。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
追記。 >char Path[] = "C:\\WINDOWS"; もし「C:\WINDOWSフォルダ」を操作しようと思うのであれば、ウィルスセキュリティソフトやファイヤウォールをすべて停止、終了させ、システムフォルダを「ウィルスに感染する無防備な状態」にしなければなりません。 そうしないと、ウィルスセキュリティソフトやファイヤウォールにより「C:\WINDOWSフォルダに対する書き込み操作は、すべて拒否」されます。 「読み取り専用属性を付ける」と言う行為も「書き込み操作」ですので、当然のように拒否されます。 つまり「属性を読むしか出来ない」です。attribコマンドも、SetFileAttributes関数も、すべて無駄に終ります。 これも「何やってもリードオンリー属性が返って来ない原因」の1つでしょう。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>指定されているパスがディレクトリの場合は、GetFileAttributes関数の戻り値がFILE_ATTRIBUTE_DIRECTORYと論理せきをとると、真になる、FILE_ATTRIBUTE_READONLY と論理せきは、真にならないですが、どういう原因でしょうか? 「読み取り専用属性を、エクスプローラーのフォルダのプロパティのダイアログで設定しようとしたから」が原因だろうと思われます。 「エクスプローラーのフォルダのプロパティのダイアログで設定する読み取り専用属性」は「フォルダの中に入っている複数のファイルを読み取り専用にするもの」であって「フォルダそのものの属性は変更しない」のです。 なので「エクスプローラーでフォルダを読み取り専用にしてから、GetFileAttributes関数を呼んでも、FILE_ATTRIBUTE_READONLYのビットが立った結果は返って来ない」です。 フォルダそのものに読み取り専用属性を付ける場合はコマンドプロンプトで「attribコマンド」に「+R」を指定して、フォルダそのものを読み取り専用にしましょう。 「attribコマンド」をしてから、GetFileAttributes関数を試せば、ちゃんとFILE_ATTRIBUTE_READONLYのビットが立った結果が返って来る筈です。 >また、どうやってReadOnlyのディレクトリを作りますか? 上記の通り、コマンドプロンプトで「attribコマンド」を使います。 プログラムで行う場合はSetFileAttributes関数を使用します。 なお、エクスプローラーの「削除」は「フォルダ自身に読み取り属性が付いたフォルダがあっても、そのフォルダと、そのフォルダの中身を、属性を無視して削除しに行く」ので「本当に読み取り属性になっているかどうか」のテストは出来ません。
お礼
返事ありがとうございました。 今思ったのは、それは本当にReadOnlyでしょうか? 私が考えているのは、ReadOnlyのディレクトリの下にファイルと サブディレクトリを作成できないようなことですが、 返答お願いします。
- php504
- ベストアンサー率42% (926/2160)
CDやDVDのディレクトリで確認すると"ReadOnlyのディレクトリ"と表示されるはずです
お礼
ありがとうございました。 それは、本当に、ReadOnlyですか? フォルダの下にファイルとかを作ることができないの?
- hidebun
- ベストアンサー率50% (92/181)
エクスプローラ上でディレクトリを右クリック→プロパティで、 読み取り専用にチェックしたから、読み取り専用属性のフラグが立つ と思ってるって落ちだと予想。 http://www.geocities.jp/site_uma/win01.html
- aris-wiz
- ベストアンサー率38% (96/252)
> すみませんが、簡単なソースでもいいから、 > ディレクトリに対する操作を添付してくれないか? ディレクトリに対する操作って属性の設定のことですか?? http://nienie.com/~masapico/api_SetFileAttributes.html >うまくいかないから。申し訳ないですが。 「何が」「どう」うまく行かないのでしょうか? そこを書かないと問題は解決できないのでは?? > どういう原因でしょうか? それぞれのフラグに対する意味を理解していますか? これら関数の仕様はご存知ですか? http://msdn.microsoft.com/ja-jp/library/cc429313.aspx http://msdn.microsoft.com/ja-jp/library/cc429784.aspx > ディレクトリのところでは、 > どう指定するすればいいでしょうか? > 単なるとして、書き込みは拒否するの? すみませんが日本語になっていません。 ディレクトリの「どこ」に「何を」指定すればいいと 言っていますか??単なる「何」?? 何に対して書き込みは拒否すると言っているの? 主語述語をはっきりさせないと質問の意図が理解できません;
お礼
言葉で表現が難しいですが、以下のソースをみていただけないでしょうか? char Path[] = "C:\\WINDOWS"; DWORD dwAttribtue = GetFileAttributes(Path); if( (dwAttribtue & FILE_ATTRIBUTE_DIRECTORY) != 0 && (dwAttribtue & FILE_ATTRIBUTE_READONLY) != 0){ //ReadOnlyのディレクトリを判定できますか? printf("ReadOnlyのディレクトリ"); }else{ printf("ReadOnlyではないディレクトリ"); } このソースで、ReadOnlyのディレクトリを判定できますか? もしそれで検出できれなら、どうテストすると思われますか?
- hidebun
- ベストアンサー率50% (92/181)
そういうことは自分のソースを乗せてから言うもんだ。
- hidebun
- ベストアンサー率50% (92/181)
お礼
すみませんが、簡単なソースでもいいから、ディレクトリに対する操作を 添付してくれないか? うまくいかないから。申し訳ないですが。
>検出 GetFileAttributesの戻り値がINVALID_FILE_ATTRIBUTESでなければFILE_ATTRIBUTE_READONLYとの論理積 >設定 SetFileAttributes
補足
指定されているパスがディレクトリの場合は、GetFileAttributes関数の戻り値がFILE_ATTRIBUTE_DIRECTORYと論理せきをとると、真になる、FILE_ATTRIBUTE_READONLY と論理せきは、真にならないですが、どういう原因でしょうか? あと、テストするために、ディレクトリのところでは、どう指定するすればいいでしょうか?単なるとして、書き込みは拒否するの? 具体的にソースを載せていただけませんか?
お礼
すみませんが、それはテストのためのものですが、 char Path[] = "C:\\WINDOWS"; じゃなくて char Path[] = "C:\\test"にして、話を進めましょう ありがとうございます。