私の知る限り、パスが長すぎる場合、ファイルに直接アクセスすることはできません (直接とは、 のメソッドを使用するか、コンストラクターを介してFile
を作成するか、 .FileInfo
Directory.GetFiles(string fileName)
このようなファイルにアクセスできるようにする唯一の方法は、パスが長くなりすぎる前にパスのどこかにあるディレクトリにアクセスし、次に示すように、ファイルに到達するまでプログラムでツリーをたどることです。
そこからコードを取得FileInfo
し、パスが「長すぎる」ファイルのオブジェクトを返すように少し変更しました。このコードを使用すると、返されたオブジェクト ( など) の必要なプロパティにアクセスできます。 ただし、 や などの機能を使用できないなど、まだいくつかの制限があります。FileInfo
LastWriteTime
CopyTo()
OpenText()
// Only call GetFileWithLongPath() if the path is too long
// ... otherwise, new FileInfo() is sufficient
private static FileInfo GetFile(string path)
{
if (path.Length >= MAX_FILE_PATH)
{
return GetFileWithLongPath(path);
}
else return new FileInfo(path);
}
static int MAX_FILE_PATH = 260;
static int MAX_DIR_PATH = 248;
private static FileInfo GetFileWithLongPath(string path)
{
string[] subpaths = path.Split('\\');
StringBuilder sbNewPath = new StringBuilder(subpaths[0]);
// Build longest sub-path that is less than MAX_PATH characters
for (int i = 1; i < subpaths.Length; i++)
{
if (sbNewPath.Length + subpaths[i].Length >= MAX_DIR_PATH)
{
subpaths = subpaths.Skip(i).ToArray();
break;
}
sbNewPath.Append("\\" + subpaths[i]);
}
DirectoryInfo dir = new DirectoryInfo(sbNewPath.ToString());
bool foundMatch = dir.Exists;
if (foundMatch)
{
// Make sure that all of the subdirectories in our path exist.
// Skip the last entry in subpaths, since it is our filename.
// If we try to specify the path in dir.GetDirectories(),
// We get a max path length error.
int i = 0;
while (i < subpaths.Length - 1 && foundMatch)
{
foundMatch = false;
foreach (DirectoryInfo subDir in dir.GetDirectories())
{
if (subDir.Name == subpaths[i])
{
// Move on to the next subDirectory
dir = subDir;
foundMatch = true;
break;
}
}
i++;
}
if (foundMatch)
{
// Now that we've gone through all of the subpaths, see if our file exists.
// Once again, If we try to specify the path in dir.GetFiles(),
// we get a max path length error.
foreach (FileInfo fi in dir.GetFiles())
{
if (fi.Name == subpaths[subpaths.Length - 1])
{
return fi;
}
}
}
}
// If we didn't find a match, return null;
return null;
}
それを見たので、目をすすぎ、道を短くしてください。