C# 使用长路径时调用WinApi
有人能帮我吗 我试图从托管.net代码中调用WINAPI方法。C# 使用长路径时调用WinApi,c#,winapi,pinvoke,createfile,C#,Winapi,Pinvoke,Createfile,有人能帮我吗 我试图从托管.net代码中调用WINAPI方法。 CreateFile()方法总是返回false。如果我将给定的路径设置为小于256,它就可以正常工作,但如果大于256,则无法正常工作。我可能做错了什么。 根据这一点,我应该能够使用长度大于256的长路径文件 下面是我尝试的代码: static void Main(string[] args) { string path = @"c:\tttttttttttaaaaaaaaaaa
CreateFile()
方法总是返回false。如果我将给定的路径设置为小于256,它就可以正常工作,但如果大于256,则无法正常工作。我可能做错了什么。
根据这一点,我应该能够使用长度大于256的长路径文件
下面是我尝试的代码:
static void Main(string[] args)
{
string path = @"c:\tttttttttttaaaaaaaaaaaaaaatttttttttttttttaaaaaaaaaaaaaaatttttttttttttttttttttttttttttttaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaattttttttttttttttttaaaaaaaaaaaaaaaaatttttttttttaaaaaaaaaaatttttttaaaaaaaaaaaaaaaaattttttttttttttttttaaaaaaaaaaaaaaaaattttttttttttttaaaaaaaaaaaaaaaaatttttt";
LongPath.TestCreateAndWrite(path);
}
// This code snippet is provided under the Microsoft Permissive License.
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern SafeFileHandle CreateFile(
string lpFileName,
EFileAccess dwDesiredAccess,
EFileShare dwShareMode,
IntPtr lpSecurityAttributes,
ECreationDisposition dwCreationDisposition,
EFileAttributes dwFlagsAndAttributes,
IntPtr hTemplateFile);
public static void TestCreateAndWrite(string fileName) {
string formattedName = @"\\?\" + fileName;
//string formattedName = @"\\?\UNC" + fileName;
// Create a file with generic write access
SafeFileHandle fileHandle = CreateFile(formattedName, EFileAccess.GenericWrite,
EFileShare.None, IntPtr.Zero, ECreationDisposition.CreateAlways, 0, IntPtr.Zero);
// Check for errors
int lastWin32Error = Marshal.GetLastWin32Error();
if (fileHandle.IsInvalid) {
throw new System.ComponentModel.Win32Exception(lastWin32Error);
}
// Pass the file handle to FileStream. FileStream will close the
// handle
using (FileStream fs = new FileStream(fileHandle,
FileAccess.Write)) {
fs.WriteByte(80);
fs.WriteByte(81);
fs.WriteByte(83);
fs.WriteByte(84);
}
}
此方法引发错误代码3,该错误代码是根据系统错误代码(0-499)(Windows)未指定的文件路径
任何帮助都是非常可观的。虽然
\\?\
符号允许您使用总长度大于MAX\u PATH
的路径,但您仍然必须遵守GetVolumeInformation
报告的每个组件的限制。对于NTFS,每个组件的限制为255,这意味着您不允许在没有反斜杠的情况下超过255个字符。在这个特定代码示例中,您试图使用长度超过256个字符的路径组件;NTFS对每个路径组件的限制是256个字符(或者可能是255个,我忘了)。“\\?\”前缀有助于长度超过256个字符的路径,但单个路径组件仍限制为255或256个字符。文件夹或文件名基本上不能超过255或256个字符。