2

私は、以前の何人かと同じように、最大​​パス長の制限に混乱しています。robocopy と新しい Windows 10 マシンを使用して、ファイルのツリーを NAS に正常に転送しました。
ソース マシンでは、すべてのファイルが 260 文字の制限内でした。これらは、robocopy を使用して、パス e: からパス \nas-3tb-backup\Public\Save_2019 にコピーされました。その後、小さな C# プログラムで確認したかったのですが、うまくいきません。FileInfo と File.OpenRead の両方が、NAS 名による拡張パスを持つファイルを見つけることができません。メモ帳、Visual Studio Code、Windows エクスプローラーなどのすべてのプログラムで、このファイルを問題なく表示または開くことができます。ここに示されているプレフィックス \\?\ を使用しようとしました: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#maxpathしかし、\\?\\\nas-3tb-backup---- の試行は失敗しました。リンクされた記事には、レジストリが変更されたときにパスを拡張するためのヒントがまだあります。これを回避したいのは、すべての Windows コンピューターを変更する必要があり、Windows 自体のプログラムがレジストリのハッキングなしで動作するため、可能であるはずだからです。

string fn1 = @"\\?\\\nas-3tb-backup\Public\VeryLongPathToFile";
bool b1 = new FileInfo(fn1).Exists;
if (b1) {
    using (FileStream stream = File.OpenRead(fn1)) {
    var b = stream.ReadByte();
    }
}
4

2 に答える 2

3

ここで説明されているように、C# ソリューションの app.config ファイルを変更しましたか.NET 4.6.2 および Windows 10 の長いパス

この投稿では、彼は非常に長いパスにフォルダーを作成しましたが、それも役立つかもしれません。

彼が使用したコード:

<runtime>
  <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
</runtime>
于 2019-12-18T12:47:04.943 に答える
2

解決

マニフェスト ファイルの作成

app.manifest ファイルには以下が含まれている必要があります

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
  </windowsSettings>
</application>

構成ファイルまたはコンピューター ポリシーを変更する必要はありません (おそらく Win32 アプリ用ですが、テストされていません)

プレフィックス \\?\ は UNC パスでは機能しません c:\ のようなローカル パスは、ローカル UNC パスとして記述する必要があります (例: \\?\C:\)

テストシステム

ウィンドウズ10版 1909 .Net Framework 4.7 C# .Net コンソール アプリ 64 ビット

于 2019-12-20T01:46:20.673 に答える