お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"ファイルのReadOnly属性を外す"



みなさん、こんにちは。

雑誌付録のCD-ROMからサンプルとなるソースやその他のものをディスクにコピー
したあと、ファイルの属性に「読取専用」のチェックボックスを外すのをめんど
くさいと感じたことはないですか。特に何階層もディレクトリがあった場合はと
ってもめんどくさいと私は思うことがあります。
そこで以下のような手続きを考えました。

添削をお願いします(^^)



//指定されたディレクトリ配下のファイル属性からReadOnlyを取り除く
procedure SetNotReadOnly(ADir:string);
var
  Handle: THandle;                // FindFirst/FindNext用
  F: TWin32FindData;              // 検索構造体
  SubDir: string;                 // 探索するサブディレクトリ
  SearchPath: string;             // 探索用フルパス
  OldAttr,NewAttr:word;           // 設定用アトリビュート
  Dir:string;
begin
  if ADir = '' then
  begin
   Dir := GetCurrentDir;
   if SelectDirectory(Dir,[],-1) then
   begin
    ADir := Dir;
   end else
   begin
    Exit;
   end;
  end;
  SearchPath := ADir;
  if (not (UpperCase(SearchPath)[1] in ['A'..'Z'])) or
     (not (UpperCase(Copy(SearchPath,2,1)) = ':')) or
     (not (UpperCase(Copy(SearchPath,3,1)) = '\')) then
  begin
   Exit;
  end;
  case GetDriveType(PChar(Copy(SearchPath,1,3))) of
   DRIVE_FIXED,DRIVE_REMOTE:
   begin
   end;
   else
   begin
    Exit;
   end;
  end;
  if SearchPath[Length(SearchPath)] ='\' then
     SearchPath := ADir + '*.*'
  else SearchPath := ADir + '\*.*';
  Handle := FindFirstFile(PChar(SearchPath), F);
  try
   if Handle <> INVALID_HANDLE_VALUE then
   begin
    repeat
     if (F.dwFileAttributes and FILE_ATTRIBUTE_READONLY) <> 0 then
     begin
      OldAttr := FileGetAttr(ExtractFilePath(SearchPath) + F.cFileName);
      NewAttr := OldAttr;
      NewAttr := NewAttr and not faReadOnly;
      FileSetAttr(ExtractFilePath(SearchPath) + F.cFileName,NewAttr);
     end;
     if (F.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then
     begin
      if F.cFileName[0] <> '.' then
      begin
       SubDir := ExtractFilePath(SearchPath) + F.cFileName;
       SetNotReadOnly(SubDir);
      end;
     end;
     Application.ProcessMessages;
    until FindNextFile(Handle, F) = False;
   end;
  finally
   Windows.FindClose(Handle);
  end;
end;


                                     98/06/08(月) 00:19 十兵衛(BZT01311)

Original document by 十兵衛          氏 ID:(BZT01311)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum