いつもお世話になります。
あるファイルの親フォルダのパスを取得すべく、
ExtractFileDir('C:\list(メニュー形式)\1.txt')
を実行したのですが、関数の結果が
C:\list(メニュー形式 ←最後の「)」が抜けている
となり、存在しないフォルダ名が返ってきました。ヘルプを
見る限り、使い方自体は間違っていないと思うのですが…
これは正しい動作なのでしょうか?自分で関数を作ればすぐ
修正できるのですが、今後この関数を使うときのために、
確認させてください。
※Delphi6 Personal + WinXP SP2の環境です。
D7 , BDS 2006 では正常な値が返ってきますからD6のバグなのかな?
私の環境は D5Pro+WinXP SP2 ですが、正常でしたよ。
// ↓このようなファイルパスの場合、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;
少なくとも
Delphi 6 アップデートファイル #1/#2
のどちらかで、この問題は修正されているようです。
# 「Delphi6 "Professional" + UPD3」にて正常動作を確認しています。
[古いバージョンのDelphiのアップデータは?]
http://homepage1.nifty.com/ht_deko/tech008.html
すみません、
>Delphi 6 アップデートファイル #1/#2のどちらか
「Delphi 6 RTL アップデート #2」の可能性もありますね。
Persinal版では、Delphi 6 アップデートファイル #2 でも、
このバグは直ってませんね。
Personal版はオイテケボリなのかな?
>このバグは直ってませんね。
マジですか!
1.Delphi 6 アップデートファイル #1(#2に含まれる)
2.Delphi 6 アップデートファイル #2
3.Delphi 6 RTL アップデート #2
この3つで、SysUtilsが更新になっているので、
どこかのタイミングでdcuも更新されたものだと思っていました。
みなさん、いない間にいろいろ検証いただいて、どうもありがとうござい
ました。こちらでもあの後、いろいろ試していたのですが、上でご指摘をい
ただいていますとおり、全角文字+末尾が半角文字1文字というパターンで
末尾の文字1文字が消えているような状態でした。
はっきりした原因が分からなかったのですが、この挙動は仕様だったのですね。
自分で関数を作って対応しようと考えていましたが、汝過ちを革むるに
憚ること勿れ 様に提示いただいたソースがありますので、確認のうえ、
これを使わせていただこうと思います。
(恥ずかしながら、LastDelimiterとか、PathDelimとか今まで見たことなかっ
たので、よりよいソースコードを書くための一教材として活用させていただ
きます。)
些細な問題にも関わらず、いろいろとご教示いただきまして、どうもあり
がとうございました。
ツイート | ![]() |