アクセスファイルを超えてMAX_PATHクライアントまで、フルのC#/.当期純
質問
背景
私は書く必要があるツール。NETバージョン2.0での最高のを使うの棚にはないオプションのためのクライアントのための政治的、商業、機密性/信頼の理由など)を移行ファイルを別のサーバには、ネットワーク."サーバーでファイルサーバのメンテナンスのための地元のチームは、特定のチームはフォルダに、移行が必要なその他のサーバーを促進する組織再編成.基本的な考え方として読まれそれぞれのファイルやストリームでは、ネットワークの時間数日後にデータ移動も行います。ファイルにアクセス権が必要に保存されます。としてこの数日間を生かしてみましょう数ギガバイトのデータより、一部チーム)に関しては、に対して繰り返し処理を実行するファイルごとを比較し、変更日および更新と変化しています。の理論とその新しいサーバーして最新のコピーをファイルを利用することが可能になりますスイッチを新しいサーバーです。ではもちろん、そうではありませんもこのシンプルなものまでデザインを考えば:)
の問題
では理論的にはまだファイルを開き、ストリームでは、ネットワークを書くのですか。:)
て行うことになったのですが、そのサーバ、ファイルの株式を作成したフォルダパスなど
D:\Data eam 株式\部部\名のチームがかなり長\
ユーザーごとに、このパスにマップされ、どうして共有してい\\サーバTEAMNAMEおよびマッピングされ、T:ます。
この状態のファイルから見えるT:ドライブ内 MAX_PATH
限定した場合は閲覧元のサーバそのものものを超えてます。できませんのでファイルにアクセスネットワークを活用した株式としてこのツールする必要汎用走行には数百ものサーバーがあり、標準的な方法を伝えるファイルの株式もしば、進むべきとするものではありませんが命名規則の標準です。また、時折サブ株式その他株式までを超える MAX_PATH
制限回!
その回避策を指定すパスは"\\?\" 接頭辞は、扱いについてUNCパスを理論的には最大32k文字です。
この回避策が実施され、Win32APIレベルのシステム。IO名前空間が(ほぼ)ばねのように薄型パネイティブWin32API機能としMicrosoftて"helpfully"行追加(誤)の検証を渡す前に、コールオフにします。この場合、.NETフレームワークは否定のパスで請求する'?'が無効なパス文字です。
なので私の質問です---があるので、いい思いが私の仕事をこなしを完全に書き換えのほとんどのシステム。IO名前空間に、負荷のP/起動電話は、この迷惑に検証?
解決
のBCLチームにした3シリーズを正確になぜこれらの選択肢でしたかのaroundsます。っていない場合は読み取れていない情報源の
他のヒント
私は助けることができる1つのサードパーティのソリューションに走りました。
それはあなたのソフトウェアが必要な権限を持っていると仮定すると、プラットフォーム呼び出しのビットでこの制限を回避することはかなり簡単にする必要があります:
[DllImport("kernel32.dll", SetLastError = true)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, IntPtr hTemplateFile);
// Must close/dispose handle separately from FileStream since it's not owned by
// that object when passed to constructor.
using (SafeFileHandle h = CreateFile(longUncPath, GENERIC_WRITE, 0, IntPtr.Zero,
OPEN_EXISTING, 0, IntPtr.Zero))
{
using (var fs = new FileStream(h, FileAccess.Read))
{
// operations with FileStream object
}
}
あなたは(または任意のAPIそれが内部的に使用しています)subst.exeを使用して親ディレクトリをマッピングすることで、パスを短くしてみてください。
HTTP ://www.makeuseof.com/tag/how-to-map-a-local-windows-folder-to-a-drive-letter/する
理想的には、パスの可能な限り離れマップと思います。
私は小さなスクリプトの下に使用してディレクトリ構造を削除する成功を収めています。 pushdは、UNCのあなたに32Kを与える形式の代わりに、260の制限を使用しています。
set "folder=\\SERVER\SHARE\DIVISION\DEPARTMENT\NAME OF TEAM - COULD BE FAIRLY LONG\"
pushd "%folder%"
for /d %%i in ("*") do rmdir "%%i" /s /q
popd