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

末尾がドット(.)で終わっているファイル名のFileInfoを取りたい

環境/言語:[OS : Windows XP / 言語 : Visual Basic .NET / .NET Framework : 3.5]
分類:[.NET]

【解決したい問題】

ネットワークの共有フォルダ内部に末尾がドットで終わっているものがあります。
これを
Dim FileInfo As New IO.FileInfo("\\servername\share\CAZYOBBL.")
のようにすると
ファイル '\\servername\share\CAZYOBBL.' が見つかりませんでした。
というエラーになります。
どのようにすればFileInfoが取れるでしょうか?

【解決するために何をしたか】

googleで
ファイル名 末尾 ピリオド .net
というキーワードで検索しましたが解決方法は見つかりませんでした。

【追加事項】

なぜこのようなファイルができたのかはわかりません。
このファイルを削除するということも今は考えていません。
2012/02/15(Wed) 20:12:01 編集(投稿者)

■No29866に返信(FNさんの記事)
> Dim FileInfo As New IO.FileInfo("\\servername\share\CAZYOBBL.")
> ファイル '\\servername\share\CAZYOBBL.' が見つかりませんでした。
こちらでは、New しただけではエラーになるようなことはありませんでした。

Win7 Enterprise(x64)/SP1 + VS2010 Ultimate + .NET 4 Client Profile(x86)
Win7 Enterprise(x64)/SP1 + VS2008 Develop + .NET 3.5(AnyCPU)


> というエラーになります。
サーバー名、共有名、ファイル名も正しくて、
アクセス権もあるのでしょうか?

System.IO.File.Exists や
System.IO.Directory.Exists の場合はどうなりますか?


> ネットワークの共有フォルダ内部に末尾がドットで終わっているものがあります。
エクスプローラーが、登録済み拡張子を非表示にする設定になっていないでしょうか。

拡張子を非表示にしていた場合、"CAZYOBBL..TXT" は "CAZYOBBL." のように見えますし、
かつ、CAZYOBBL. という名のファイルは存在しないという状態になりえます。


> なぜこのようなファイルができたのかはわかりません。
理由はともかくとして、意図的に作成すること自体は簡単です。
たとえば、C:\TEMP\TEST フォルダがあるとして、コマンドプロンプトから

CD /D C:\TEMP\TEST
ECHO ON>\\?\C:\TEMP\TEST\CAZYOBBL.

というコマンドを打ち込めば、0バイトの『C:\TEMP\TEST\CAZYOBBL.』を
作成することができます。もちろん、ネットワークドライブへの作成も可能。

ただし、末尾ピリオドという特殊なファイル名のため、エクスプローラ等からの
操作については制限されることになります(試す場合は自己責任でどうぞ)。
通常C#使っているので、見当違いかもしれません。

> Dim FileInfo As New IO.FileInfo("\\servername\share\CAZYOBBL.")
\ではなく、\\を使うのではないでしょうか。

私の場合も、ファイルがピリオドで終わっていてもFileInfoは正常に取得できます。
■No29875に返信(はまさんの記事)
>>Dim FileInfo As New IO.FileInfo("\\servername\share\CAZYOBBL.")
> \ではなく、\\を使うのではないでしょうか。
使いません。
上記は、C# でいうところの『@"\\servername\share\CAZYOBBL."』を意味します。


> 私の場合も、ファイルがピリオドで終わっていてもFileInfoは正常に取得できます。
New した時点でエラーになる現象は、当方では未だに再現できていないのですが、
これはあくまでもエラーにならないというだけであって、今回のファイルに
関する情報を、FileInfo 経由で得られるというわけではありません。

何故ならば、"\\servername\share\CAZYOBBL." を指定しても、実際に
走査されるのは "\\servername\share\CAZYOBBL" のパスだからです。
また、\\?\ で始まるパス指定もサポートされていません。

一応、上位ディレクトリーの DirectoryInfo から GetFiles することで、
こうした特殊なファイルの FileInfo を得る回避策が使えるケースもありますが、
少なくとも New FileInfo(String) を使う限り、ファイル情報は取得できません。


そもそも、こうした特殊なパス(ピリオドで終わるパスなど)については、
System.IO 名前空間のクラス群はほとんど役に立ちません。
(COM コンポーネントの Scripting.FileSystemObject を使えば
 \\?\ 形式のパスにも対応できるので多少はマシになりですが、
これとて完全ではありませんし)

そのため、どうしてもこうした特殊なパスを扱う必要があるのなら、
CreateFile API 等を使って処理することも検討してみてください。

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