- PR -

長いパスの対応方法

1
投稿者投稿内容
stella
会議室デビュー日: 2007/05/15
投稿数: 1
投稿日時: 2007-05-15 09:19
VisualStudio2005 でC#を使用しています。

FileInfoクラスのCopyTOメソッド等で、
扱うパスが長い場合に 例外PathTooLongExceptionが発生してしまいます。

ターゲットのプラットフォームはWindowsXP + NTFSのみに限定しているので
システム上はより長いパスが扱えます。

.NET Framework の制限に縛られずに、より長いパスを扱える方法がありましたら
教えてください。

過去のスレッドで \\?\ を付けると回避できるらしいご回答があり試しましたが
正常なパスと認識されないようです。
(@"c:\test\t.txt" を @"\\?\c:\test\t.txt"に変えるとArgumentExceptionが発生します。)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-15 09:28
引用:

NothingButXMLInfoSetさんの書き込み (2003-04-03 14:08) より:

どうやら、System.IO.File.Existsならイケるみたいです。
パスを\\?\...の形式にする必要がありますが。


と書かれておりますね。

引用:

stellaさんの書き込み (2007-05-15 09:19) より:

.NET Framework の制限に縛られずに、より長いパスを扱える方法がありましたら
教えてください。


.NET Framework の制限?

全体的な回避をしたいのであれば GetShortPathName 関数を利用した方が良いかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-05-16 06:19
じゃんぬさん

 いや、できる"はず"ですよ。
引用:

FileInfo クラス<microsoft.com> より:
パスを受け入れるメンバでは、ファイルまたはディレクトリを参照するパスを指定できます。指定するパスは、相対パス、またはサーバーおよび共有名を示す UNC (Universal Naming Convention) パスにすることができます。たとえば、次に示すパスはすべて有効なパスです。

  • C# では "c://MyDir//MyFile.txt"、Visual Basic では "c:/MyDir/MyFile.txt"。
  • C# では "c://MyDir"、Visual Basic では "c:/MyDir"。
  • C# では "MyDir//MySubdir"、Visual Basic では "MyDir/MySubDir"。
  • C# では "////MyServer//MyShare"、Visual Basic では "//MyServer/MyShare"。


"//[hostname]/C$/test/t.txt" ならいけるんだろうな。。。
(スラッシュの代わりにバック スラッシュを使用)
_________________
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-05-16 22:51
扱うのが UNC とかそういうことでは?UNCの場合には、

"\\?\UNC\<server>\<share>"

Naming a File
_________________
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-05-17 21:52
"//servername/shareddirectory/..." は 「UNC パス名」
"//?/c:¥file-path¥..." は、「Long-UNC パス名」

別物でした。失礼しました。
参考:
http://en.wikipedia.org/wiki/Path_(computing)#Universal_Naming_Convention

 で、UNC 形式でも、260 文字未満という制限を受けます。
 そして、Long-UNC 形式に対応しているものと、していないものがあると。しているものは、ほとんど無い、ようです。

_________________
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-05-18 02:48
あ、ほんとだ。できないですね。.NET だと。

しかし、これひどいなぁ。。。
COM の Scripting.FileSystemObject ですら対応しているのにね。

P/Invoke 使って、Win32 呼び出してやればいいんじゃない?

ちょっと情報を漁っていたら reference の間違い発見。

引用:

File.Copy メソッド (String, String) より引用:
PathTooLongException
指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。たとえば、Windows ベースのプラットフォームの場合、パスの長さは 248 文字未満、ファイル名の長さは 260 文字未満である必要があります。



おいおい。って英語も見たらこちらからしてすでにおかしい。。。
_________________
1

スキルアップ/キャリアアップ(JOB@IT)