ExtractFileDir(ファイルの親フォルダ名を返す関数) が存在しないフォルダ名を返す

解決


まこと  2008-03-01 18:33:19  No: 29970

いつもお世話になります。

あるファイルの親フォルダのパスを取得すべく、
ExtractFileDir('C:\list(メニュー形式)\1.txt')

を実行したのですが、関数の結果が

C:\list(メニュー形式     ←最後の「)」が抜けている

となり、存在しないフォルダ名が返ってきました。ヘルプを
見る限り、使い方自体は間違っていないと思うのですが…
これは正しい動作なのでしょうか?自分で関数を作ればすぐ
修正できるのですが、今後この関数を使うときのために、
確認させてください。

※Delphi6 Personal + WinXP SP2の環境です。


KHE00221  2008-03-01 19:00:01  No: 29971

D7 , BDS 2006 では正常な値が返ってきますからD6のバグなのかな?


deldel  2008-03-01 19:52:53  No: 29972

私の環境は D5Pro+WinXP SP2 ですが、正常でしたよ。


汝過ちを革むるに憚ること勿れ  2008-03-01 21:06:57  No: 29973

// ↓このようなファイルパスの場合、D6で ExtractFileDirを実行すると、
  // パスの末尾の半角文字が消える。 多分、D6だけのバグだネ。
  // D6でExtractFileDir関数を使う時は注意すべし。
  Memo1.Lines.Add(ExtractFileDir_Bug('C:\パスの末尾が全角文字+"半角文字"\ファイル名.ext'));
  // Bugfix版ならOK
  Memo1.Lines.Add(ExtractFileDir_Fix('C:\パスの末尾が全角文字+"半角文字"\ファイル名.ext'));

  // D6版のExtractFileDir
  function ExtractFileDir_Bug(const FileName: string): string;
  var
   I: Integer;
  begin
   I := LastDelimiter(PathDelim + DriveDelim, Filename);
   if (I > 1)and(FileName[I] = PathDelim)and
      (((FileName[I - 1] <> PathDelim)and(FileName[I-1] <> DriveDelim))or
      (ByteType(FileName, I-1) = mbTrailByte)) then Dec(I);
   while (ByteType(FileName, I-1) = mbTrailByte)and(I > 0) do Dec(I);
   Result := Copy(FileName, 1, I);
  end;

  // BugFix版のExtractFileDir
  function ExtractFileDir_Fix(const FileName: string): string;
  var
   I: Integer;
  begin
   I := LastDelimiter(PathDelim + DriveDelim, Filename);
   if (I > 1)and(FileName[I] = PathDelim)and
      (not IsDelimiter(PathDelim + DriveDelim, FileName, I-1)) then Dec(I);
   Result := Copy(FileName, 1, I);
  end;


DEKO  2008-03-02 02:16:19  No: 29974

少なくとも
Delphi 6 アップデートファイル #1/#2
のどちらかで、この問題は修正されているようです。
# 「Delphi6 "Professional" + UPD3」にて正常動作を確認しています。

[古いバージョンのDelphiのアップデータは?]
http://homepage1.nifty.com/ht_deko/tech008.html


DEKO  2008-03-02 02:23:46  No: 29975

すみません、
>Delphi 6 アップデートファイル #1/#2のどちらか
「Delphi 6 RTL アップデート #2」の可能性もありますね。


少なくとも  2008-03-02 02:32:55  No: 29976

Persinal版では、Delphi 6 アップデートファイル #2 でも、
このバグは直ってませんね。
Personal版はオイテケボリなのかな?


DEKO  2008-03-02 03:57:29  No: 29977

>このバグは直ってませんね。
マジですか!

1.Delphi 6 アップデートファイル #1(#2に含まれる)
2.Delphi 6 アップデートファイル #2
3.Delphi 6 RTL アップデート #2

この3つで、SysUtilsが更新になっているので、
どこかのタイミングでdcuも更新されたものだと思っていました。


まこと  2008-03-02 05:17:39  No: 29978

みなさん、いない間にいろいろ検証いただいて、どうもありがとうござい
ました。こちらでもあの後、いろいろ試していたのですが、上でご指摘をい
ただいていますとおり、全角文字+末尾が半角文字1文字というパターンで
末尾の文字1文字が消えているような状態でした。
  はっきりした原因が分からなかったのですが、この挙動は仕様だったのですね。

  自分で関数を作って対応しようと考えていましたが、汝過ちを革むるに
憚ること勿れ  様に提示いただいたソースがありますので、確認のうえ、
これを使わせていただこうと思います。
(恥ずかしながら、LastDelimiterとか、PathDelimとか今まで見たことなかっ
たので、よりよいソースコードを書くための一教材として活用させていただ
きます。)

  些細な問題にも関わらず、いろいろとご教示いただきまして、どうもあり
がとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加