No.1
- 回答日時:
>検出
GetFileAttributesの戻り値がINVALID_FILE_ATTRIBUTESでなければFILE_ATTRIBUTE_READONLYとの論理積
>設定
SetFileAttributes
この回答への補足
指定されているパスがディレクトリの場合は、GetFileAttributes関数の戻り値がFILE_ATTRIBUTE_DIRECTORYと論理せきをとると、真になる、FILE_ATTRIBUTE_READONLY と論理せきは、真にならないですが、どういう原因でしょうか?
あと、テストするために、ディレクトリのところでは、どう指定するすればいいでしょうか?単なるとして、書き込みは拒否するの?
具体的にソースを載せていただけませんか?
すみませんが、簡単なソースでもいいから、ディレクトリに対する操作を
添付してくれないか?
うまくいかないから。申し訳ないですが。
No.4
- 回答日時:
> すみませんが、簡単なソースでもいいから、
> ディレクトリに対する操作を添付してくれないか?
ディレクトリに対する操作って属性の設定のことですか??
http://nienie.com/~masapico/api_SetFileAttribute …
>うまくいかないから。申し訳ないですが。
「何が」「どう」うまく行かないのでしょうか?
そこを書かないと問題は解決できないのでは??
> どういう原因でしょうか?
それぞれのフラグに対する意味を理解していますか?
これら関数の仕様はご存知ですか?
http://msdn.microsoft.com/ja-jp/library/cc429313 …
http://msdn.microsoft.com/ja-jp/library/cc429784 …
> ディレクトリのところでは、
> どう指定するすればいいでしょうか?
> 単なるとして、書き込みは拒否するの?
すみませんが日本語になっていません。
ディレクトリの「どこ」に「何を」指定すればいいと
言っていますか??単なる「何」??
何に対して書き込みは拒否すると言っているの?
主語述語をはっきりさせないと質問の意図が理解できません;
言葉で表現が難しいですが、以下のソースをみていただけないでしょうか?
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のディレクトリを判定できますか?
もしそれで検出できれなら、どうテストすると思われますか?
No.5
- 回答日時:
エクスプローラ上でディレクトリを右クリック→プロパティで、
読み取り専用にチェックしたから、読み取り専用属性のフラグが立つ
と思ってるって落ちだと予想。
http://www.geocities.jp/site_uma/win01.html
No.7
- 回答日時:
>指定されているパスがディレクトリの場合は、GetFileAttributes関数の戻り値がFILE_ATTRIBUTE_DIRECTORYと論理せきをとると、真になる、FILE_ATTRIBUTE_READONLY と論理せきは、真にならないですが、どういう原因でしょうか?
「読み取り専用属性を、エクスプローラーのフォルダのプロパティのダイアログで設定しようとしたから」が原因だろうと思われます。
「エクスプローラーのフォルダのプロパティのダイアログで設定する読み取り専用属性」は「フォルダの中に入っている複数のファイルを読み取り専用にするもの」であって「フォルダそのものの属性は変更しない」のです。
なので「エクスプローラーでフォルダを読み取り専用にしてから、GetFileAttributes関数を呼んでも、FILE_ATTRIBUTE_READONLYのビットが立った結果は返って来ない」です。
フォルダそのものに読み取り専用属性を付ける場合はコマンドプロンプトで「attribコマンド」に「+R」を指定して、フォルダそのものを読み取り専用にしましょう。
「attribコマンド」をしてから、GetFileAttributes関数を試せば、ちゃんとFILE_ATTRIBUTE_READONLYのビットが立った結果が返って来る筈です。
>また、どうやってReadOnlyのディレクトリを作りますか?
上記の通り、コマンドプロンプトで「attribコマンド」を使います。
プログラムで行う場合はSetFileAttributes関数を使用します。
なお、エクスプローラーの「削除」は「フォルダ自身に読み取り属性が付いたフォルダがあっても、そのフォルダと、そのフォルダの中身を、属性を無視して削除しに行く」ので「本当に読み取り属性になっているかどうか」のテストは出来ません。
返事ありがとうございました。
今思ったのは、それは本当にReadOnlyでしょうか?
私が考えているのは、ReadOnlyのディレクトリの下にファイルと
サブディレクトリを作成できないようなことですが、
返答お願いします。
No.8
- 回答日時:
追記。
>char Path[] = "C:\\WINDOWS";
もし「C:\WINDOWSフォルダ」を操作しようと思うのであれば、ウィルスセキュリティソフトやファイヤウォールをすべて停止、終了させ、システムフォルダを「ウィルスに感染する無防備な状態」にしなければなりません。
そうしないと、ウィルスセキュリティソフトやファイヤウォールにより「C:\WINDOWSフォルダに対する書き込み操作は、すべて拒否」されます。
「読み取り専用属性を付ける」と言う行為も「書き込み操作」ですので、当然のように拒否されます。
つまり「属性を読むしか出来ない」です。attribコマンドも、SetFileAttributes関数も、すべて無駄に終ります。
これも「何やってもリードオンリー属性が返って来ない原因」の1つでしょう。
すみませんが、それはテストのためのものですが、
char Path[] = "C:\\WINDOWS"; じゃなくて
char Path[] = "C:\\test"にして、話を進めましょう
ありがとうございます。
No.9
- 回答日時:
>今思ったのは、それは本当にReadOnlyでしょうか?
フォルダに読み取り専用属性を付けても、フォルダの中身はリードオンリーではありません。
ファイルもサブディレクトリも作れてしまいます。
XPがそういう仕様になっていますから。
>私が考えているのは、ReadOnlyのディレクトリの下にファイルと
>サブディレクトリを作成できないようなことですが、
それを実行するには、NTFSを使用し、アドミン特権を得てフォルダのアクセス権を変更すればどうにか出来るかも知れませんが「ファイルやフォルダの新規作成だけさせない」のは無理かも知れません。
No.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;
}
#インデントは全角。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- その他(プログラミング・Web制作) 図に示す階層構造で,現在のディレクトリ(カレントディレクトリという)が*印のディレクトリであるとき, 2 2022/11/16 10:55
- PHP ファイルアップロードに関してのセキュリティについてアドバイスお願い致します 1 2023/08/20 00:25
- その他(開発・運用・管理) フォルダの中にファルダを作成してファイルを格納するバッチコマンド 1 2022/06/30 11:39
- UNIX・Linux JSLinuxについて。 Linuxのこの手順のプログラミングは合っているでしょうか。 ①ホームディ 2 2022/06/20 15:33
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- その他(開発・運用・管理) 【至急】.htaccessによるディレクトリ単位でのリダイレクト 2 2023/08/10 13:46
- CGI CGIが読み書きするデータファイルのパーミッションはさくらのインターネットでは何にするべき? 1 2023/05/02 16:44
- その他(開発・運用・管理) バッチファイルで特定のファイル・ディレクトリ以外を削除する方法について 4 2022/05/31 14:03
- UNIX・Linux 空のディレクトリで dir を行ったとき 4 2023/05/05 17:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どんなプログラムを書いても指...
-
マイクラでPythonのプログラミ...
-
FTPでputすると空ファイルが出...
-
windows.hがincludeされない
-
絶対パスの絶対て英語で何でし...
-
フルパスから最後のディレクト...
-
ネットワーク上のコンピュータ...
-
C#でカレントディレクトリの取...
-
[asp/vbs]FileExistsのパスの指...
-
ExcelVBAでカレントディレクト...
-
「UNCパスはサポートされません...
-
エクセルVBAで相対パスでファイ...
-
GetPrivateProfileStringでini...
-
fopenで別ディレクトリにファイ...
-
C言語からC++の関数をコールす...
-
AfxLoadLibrary関数で、DLLのハ...
-
Windowsファイルパスはスラッシ...
-
ファイルやディレクトリの存在...
-
[VC]VCのデバッグ実行で落ちる...
-
Ubuntu テキストファイルをどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どんなプログラムを書いても指...
-
フルパスから最後のディレクト...
-
FTPでputすると空ファイルが出...
-
windows.hがincludeされない
-
ExcelVBAでカレントディレクト...
-
「UNCパスはサポートされません...
-
マイクラでPythonのプログラミ...
-
C言語を用いたファイルの一括削...
-
fopenで別ディレクトリにファイ...
-
GetPrivateProfileStringでini...
-
ファイルやディレクトリの存在...
-
ネットワーク上のコンピュータ...
-
ExcelVBA サーバーの(共有フォ...
-
エクセルVBAで相対パスでファイ...
-
pythonでの日本語操作
-
VBAで自身のファイル名を取得す...
-
webアプリケーションでの画像フ...
-
絶対パスの絶対て英語で何でし...
-
ファイルダイアログのカレント...
-
圧縮(Zip)について
おすすめ情報