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

解決


まこと  2008-03-01 09:33:19  No: 29970  IP: 192.*.*.*

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

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

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

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

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

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

編集 削除
KHE00221  2008-03-01 10:00:01  No: 29971  IP: 192.*.*.*

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

編集 削除
deldel  2008-03-01 10:52:53  No: 29972  IP: 192.*.*.*

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

編集 削除
汝過ちを革むるに憚ること勿れ  2008-03-01 12:06:57  No: 29973  IP: 192.*.*.*

// ↓このようなファイルパスの場合、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-01 17:16:19  No: 29974  IP: 192.*.*.*

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

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

編集 削除
DEKO  2008-03-01 17:23:46  No: 29975  IP: 192.*.*.*

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

編集 削除
少なくとも  2008-03-01 17:32:55  No: 29976  IP: 192.*.*.*

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

編集 削除
DEKO  2008-03-01 18:57:29  No: 29977  IP: 192.*.*.*

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

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

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

編集 削除
まこと  2008-03-01 20:17:39  No: 29978  IP: 192.*.*.*

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

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

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

編集 削除