お知らせ

電子会議

ライブラリ

FDelphi サイト全文検索

Delphi FAQ一覧

サンプル蔵



FDelphi FAQ
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」

[Q]
Win95ではカラントディレクトリ名もリネームできますね。Win3.1ではだめで したが。

[A]
 DirectoryListBoxなどのコンポを使っているかどうかで、ディレクトリー
リネームの時のエラーの出方が違います。

 (1) 作成サンプルのフォーム
 DirBox(-): DirectoryListBox を配置していないフォーム
 DirBox(+): DirectoryListBox を配置したフォーム

 (2) コンパイルおよび実行環境
 Win3-1 : Win3.1 上で Delphi 1.0J
 Win95-1: Win95 上で Delphi 1.0J
 Win95-2: Win95 上で Delphi 2.0J

 それで、DirBox(-) を次のようにコーディングします。

    h:\dir1\dir2\dir3

というディレクトリーが設定されているとして、現ネーム、改名ネームを、
Edit1、Edit2 にセットします。例えば、

    Edit1.Text=CurDir ='h:\dir1\dir2'   {これはコードではありません}
    Edit2.Text=nCurDir='h:\dir1\dir2a'  {           〃             }
                                        (下のコード*0)

そして、カラントディレクトリーを、現ネームにしてから(同じく*1)、

    RenameFile(CurDir,nCurDir); (同じく*2)

を実行してみます。

{----- 適当なボタンクリックイベントで実行して下さい -----}
var
  CurDir,nCurdir
        : TFilename;
{$IFNDEF WIN32}
  GetCurrentDir        {2.0J では定義済なので削除します}
        : TFilename;   {コンパイル指令入れると読みづらいですね}
  iDrive
        : integer;
{$ENDIF}
begin
  CurDir:=Edit1.Text;                    {<----*0}
  nCurDir:=Edit2.Text;                   {     *0}
  ChDir(CurDir);                         {<----*1}
{$IFNDEF WIN32}
  iDrive:=ord(UpCase(CurDir[1]))-ord('A')+1;
  GetDir(iDrive,GetCurrentDir);
{$ENDIF}
  ShowMessage('カラント='+GetCurrentDir+#13+
    CurDir+' を'#13+
    nCurDir+' とリネームします。');
  if RenameFile(CurDir,nCurDir) then     {<----*2}
    ShowMessage('OK!')
  else
    ShowMessage('No!')
end;
{----- ここまで -----}

 DirBox(+) の方は、DirectoryListBox1 を配置して、上のような、EditBox
に、DirectoryListBox1.Directory が入るように工夫し、同じことを実行し
ます。この場合は、カラントディレクトリーのほかに、DirectoryListBox1.
Directory がどのような状態で、RenameFile するかが問題になります。

 以下の結果で、+: OK!、-: No! は、上述コーディングに従ってこのように
ShowMessageで表示され、特にエラーメッセージは出なかったことを示してい
ます。

            Win3-1 Win95-1 Win95-2
−−−−−−−−−−−−−−−−−−−−−−−−−
 DirBox(-)
  カラントで実行    -    +    +  <----[Q]はこのことを
  親Directoryで実行   +    +    +     言っているんで
                           すね。
 DirBox(+)
 (カラントで実行    -   (+E)   (+E))<---(本文参照)
  カラントで実行    -    +E1   +e! <---- +e1、+e! は工夫
  親Directoryで実行  +e1   +e1   +e! <----して免れられます
−−−−−−−−−−−−−−−−−−−−−−−−−  (本文参照)
                        
 +e! は、問題なく実行できましたが、DirectoryListBox1 が元のディレク
トリー名を表示している状態でリネームし、その後、同じドライブの他のデ
ィレクトリーに、DirectoryListBox1 を使って移動しようとした場合、

 「ファイルが見つかりません」

というエラーメッセージ後、

 「アドレス〜でアドレスFFFFFFFに対する読み込み違反が起こりました」

というエラーメッセージが現れます。

 +e1、+E1 も、問題なく実行でき、その後 DirectoryListBox1 に関する同
様な操作で「不正なファイル名です」というエラーメッセージが出たことを示し
ています。

 (+E) は、リネームできた後、上と同じように、DirectoryListBox1に元の
ディレクトリー名が残っている状態で、DirectoryListBox1 を使って他のデ
ィレクトリーに移動しようとした場合、

 「フ゜ロシ゛ェクト (〜.exe) が EInOutError クラスの例外を生成しました。不正
なファイル名です。フ゜ロセスは停止しています。再開するにはステッフ゜実行または実行
を選択して下さい」

というエラーメッセージボックスが現れたことを示しています(IDE 実行の
場合)。これは、MES 8 #2252 (97/3/11) で書いていることですが、ツール
−オプション−設定の、「例外でデバッガを開く」がONの場合でした。OFFの
場合は +e1 あるいは +e! になります。

 (+E) および +E1 は逃れる術がありませんでしたが、+e1、+e! は、例えば、
RenameFile 後、DirectoryListBox1.Drive を一旦他のドライブに設定し、そ
の後に元のドライブに戻れば、エラーにならずに更新できることにも気づき
ました(下例参照)。
[例]
 +e1 や +e! を免れるコーディング例です。上の説明コード中、(2)以降を次
のように変更すればよいです。

  if RenameFile(CurDir,nCurDir) then begin    {<----*2}
    ShowMessage('OK!')
{$IFDEF WIN32}     {DirBox(+)で、カラントディレクトリーを変更して}
                   {エラーを免れるのは 2.0J-Win95 の場合}
    with DriveComboBox1 do begin  {DriveComboBox1 を配置し、DirList=}
      Drive:=GetOtherHD(iDrive);  {DirectoryListBox1 としています}
      Drive:=CurDir[1];           {GetOtherHD で、他のドライブに設定}
    end;                          {し、戻る}
    DirectoryListBox1.Directory:=nCurDir;  {DirectoryListBox1も戻す}
{$ENDIF}
  end else
     ShowMessage('No!');

{=========================================================}
function GetOtherHD(iDrive: integer): char;
(*ドライブ番号iDrive(カレント=0; 1以上が'A'以上に相当)
 以外のハードディスクドライブを求める。
 戻り値はドライブ記号'A'〜'Z'*)
var
  i,j: integer;
begin
  Result:='A';
  for i:=1 to 26 do begin
{$IFDEF WIN32}
    j:=GetDriveType(PChar(chr(i+ord('A')-1)+':\'));
{$ELSE}
    j:=GetDriveType(i-1);
{$ENDIF}
    if (iDrive<>i) and (j=DRIVE_FIXED) then begin
      Result:=chr(i+ord('A')-1);
      break;
    end;
  end;
end; {GetOtherHD}


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。

Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会