DOBON.NET DOBON.NETプログラミング掲示板過去ログ

末尾に全角空白を含むファイルのコピー

環境/言語:[VB.NET .NET Framework1.1]
分類:[.NET]

ファイルをコピーする処理をVB.NET作成しています。

かなりイレギュラーな例だと思いますが、ファイル名の末尾に全角空白を持つ
ファイルがあり、そのコピーができません。
どうも末尾の全角空白を無視してしまうようです。

末尾が半角空白のファイルはWindows上で作成できないようですが、
全角空白の場合は作成可能です。

フォルダの中のファイル一覧を取得する際に、そのフォルダが末尾に
全角空白を持つときはパスの末尾に"\"を追加することで回避できましたが、
ファイル名の場合はこの方法が使えません。

.NETの仕様上、不可避な問題かもしれませんが、対処方法をご存知の方が
いらっしゃいましたらご教示ください。

.NET Framework1.1、Windows2000/XPでこの現象を確認しています。

以下のコードで現象が確認できます。

'末尾に全角空白のあるファイルのコピー
Try
    Dim copyPath As String = "C:\test.txt "
    Dim destPath As String = "C:\test_copy.txt "
    System.IO.File.Copy(copyPath, destPath, True)
    debug.WriteLine(copyPath & "コピー成功")
Catch ex As Exception
    debug.WriteLine(Err.Description)
End Try
'結果:[ファイル "C:\test.txt " が見つかりませんでした。]
'※"C:\test.txt"が存在する場合は、それが"C:\test_copy.txt"にコピーされる。
2006/07/18(Tue) 11:11:48 編集(投稿者)

VB2005ですが、下のようなコードを試してみました。
 
Dim folder As New IO.DirectoryInfo("C:\")
 
For Each fi As IO.FileInfo In folder.GetFiles()
    If Right(fi.Name, 1) = " " Then
        Try
            If fi.Exists() Then
                Console.WriteLine("'" & fi.FullName & "'は存在します。")
            End If
            fi.CopyTo("C:\test_copy.txt ")
            Console.WriteLine("OK")
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
        Exit For
    End If
Next
 
結果は変わらずです。
 
ちなみに、Win32 APIのCopyFileならば難なくコピーできるようです。
> fi.CopyTo("C:\test_copy.txt ")

少し試してみましたが,FileInfo.MoveTo を使い,ファイル名の最後に "." を付けることで "test.txt " というファイルを "test_copy.txt " にリネームすることはできそうですね.
テンポラリファイルに一旦コピーして,さらに MoveTo することで,無理矢理対処することは出来そうです.

fi.MoveTo("C:\test_copy.txt .")

ご参考までに.
こんにちは。

私も少し(興味本位で(笑))試してみました。
NyaRuRu さんの「最後に "." を付ける方式」を応用すると、
File.Copy でもいけそうな感じがします。

System.IO.File.Copy("C:\test.txt .", "C:\test_copy.txt .")

というような感じで。

終端文字が全角スペースならば "." を付ける(コピーのときだけ)と
いう風にするとなんとか行きそうな気配…。どうでしょうか。
皆さんありがとうございます。

> System.IO.File.Copy("C:\test.txt .", "C:\test_copy.txt .")

この方法で問題なくコピーできました。

末尾に全角空白を含むかどうかの判定を行った後で、"."を付ける/付けないに
分岐させる必要があるかなと思いましたが、実際に動かしてみると、
普通のファイルパスの末尾に"."をつけても問題ないようです。
解決済み!
2006/07/18(Tue) 16:34:39 編集(投稿者)

>最後に "." を付ける方式
こんな裏技のような方法があるとは思いつきませんでした。
かなり勉強になりました。

ちなみに、フォルダ名につけるとどうなるんだろうかな?

> 末尾に全角空白を含むかどうかの判定を行った後で、"."を付ける/付けないに
> 分岐させる必要があるかなと思いましたが
一応後から、何で末尾に"."つけてんだ?と思わないようにはしておかないといけませんね。
(レビュー時に突っ込まれないようにはしておかないとw)

# 解決チェック、いつも入れ忘れる罠。。。orz
解決済み!
2006/07/18(Tue) 18:08:27 編集(投稿者)
■No16693に返信(Blueさんの記事)
> 2006/07/18(Tue) 16:34:39 編集(投稿者)
>
> >最後に "." を付ける方式
> こんな裏技のような方法があるとは思いつきませんでした。
> かなり勉強になりました。

ファイル名末尾のスペースや "." については,Win32 レベルでの特殊動作です.
というわけで一応このあたりは目を通しておいた方がいいですかね.

『Windowsパス名の落とし穴』
http://www.ipa.go.jp/security/awareness/vendor/programming/b08_01.html
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板