现在,又回归到代码编写了。
其实,安安静静地享受编码的过程,是一个很美好的旅程,从此以后,就尽情享受这一过程吧。
现在,就遇到了在Windows上如何访问和操作超长文件(长度超过256)的问题。此前一直使用open、read、write等Windows原始开发接口,为照顾和Linux、Unix等接口类型的兼容性,没有使用Win32的SDK接口,这下搞不定了。
经过本次调研,发现访问超长文件名的方法,基本上有两种
一、将文件名缩短成8.3格式,继续使用原始开发接口来操作
The GetShortPathName function retrieves the short path form of a specified input path.
DWORD GetShortPathName( LPCTSTR lpszLongPath, // null-terminated path string LPTSTR lpszShortPath, // short form buffer DWORD cchBuffer // size of short form buffer );
Parameters
- lpszLongPath
- [in] Pointer to a null-terminated path string. The function retrieves the short form of this path.
Windows NT/2000/XP: In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this
limit to nearly 32,000 wide characters, call the Unicode version of the function and prepend "\\?\" to the path. For more information, see File
Name Conventions.Windows 95/98/Me: This string must not exceed MAX_PATH characters.
- lpszShortPath
- [out] Pointer to a buffer to receive the null-terminated short form of the path specified by lpszLongPath.
- cchBuffer
- [in] Specifies the size, in TCHARs, of the buffer pointed to by lpszShortPath.
Return Values
If the function succeeds, the return value is the length, in TCHARs, of the string copied to lpszShortPath,
not including the terminating null character.
If the lpszShortPath buffer is too small to contain the path, the return value is the size of the buffer, in TCHARs,
required to hold the path. Therefore, if the return value is greater than cchBuffer, call the function again with a buffer that is large enough to hold the path.
If the function fails for any other reason, the return value is zero. To get extended error information, call GetLastError.
从lpszLongPath参数的说明可以看出,GetShortPathNameW函数,可以对目录或文件名进行缩短,但有个前提是目录或文件名必须存在。即
1)对于已经存在的目录或文件,适用;
2)对于不存在的目录或文件(新建目录或文件时),不适用;
二、借用Win32接口来实现对超长文件名的文件或目录的操作
其中,涉及到如下的函数
Function | Description |
---|---|
AreFileApisANSI | Determines whether the file I/O functions are using the ANSI or OEM character set code page. |
CancelIo | Cancels all pending I/O operations that were issued by the calling thread for the specified file handle. |
CloseHandle | Closes an open object handle. |
CopyFile | Copies an existing file to a new file. |
CopyFileEx | Copies an existing file to a new file. |
CopyProgressRoutine | An application-defined callback function used with CopyFileEx and MoveFileWithProgress. |
CreateDirectory | Creates a new directory. |
CreateDirectoryEx | Creates a new directory with the attributes of a specified template directory. |
CreateFile | Creates or opens a file object. |
CreateIoCompletionPort | Creates and I/O completion port or associates an instance of an opened file with a newly created or an existing I/O completion port. |
DefineDosDevice | Defines, redefines, or deletes MS-DOS device names. |
DeleteFile | Deletes an existing file. |
FileIOCompletionRoutine | An application-defined callback function used with ReadFileEx and WriteFileEx. |
FindClose | Closes the specified search handle. |
FindCloseChangeNotification | Stops change notification handle monitoring. |
FindFirstChangeNotification | Creates a change notification handle. |
FindFirstFile | Searches a directory for a file whose name matches the specified file name. |
FindFirstFileEx | Searches a directory for a file whose name and attributes match those specified. |
FindNextChangeNotification | Requests that the operating system signal a change notification handle the next time it detects an appropriate change. |
FindNextFile | Continues a file search. |
FlushFileBuffers | Clears the buffers for the specified file and causes all buffered data to be written to the file. |
GetBinaryType | Determines whether a file is executable. |
GetCurrentDirectory | Retrieves the current directory for the current process. |
GetDiskFreeSpace | Retrieves information about the specified disk, including the amount of free space on the disk. |
GetDiskFreeSpaceEx | Retrieves information about the specified disk, including the amount of free space on the disk. |
GetDriveType | Determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive. |
GetFileAttributes | Retrieves attributes for a specified file or directory. |
GetFileAttributesEx | Retrieves attributes for a specified file or directory. |
GetFileInformationByHandle | Retrieves file information for a specified file. |
GetFileSize | Retrieves the size of a specified file. |
GetFileSizeEx | Retrieves the size of a specified file. |
GetFileType | Retrieves the file type of the specified file. |
GetFullPathName | Retrieves the full path and file name of a specified file. |
GetLogicalDrives | Returns a bitmask representing the currently available disk drives. |
GetLogicalDriveStrings | Fills a buffer with strings that specify valid drives in the system. |
GetLongPathName | Converts the specified path to its long form. |
GetQueuedCompletionStatus | Attempts to dequeue an I/O completion packet from a specified I/O completion port. |
GetShortPathName | Retrieves the short path form of a specified input path. |
GetTempFileName | Creates a name for a temporary file. |
GetTempPath | Retrieves the path of the directory designated for temporary files. |
LockFile | Locks a region in an open file. |
LockFileEx | Locks a region in an open file for shared or exclusive access. |
MoveFile | Moves an existing file or a directory. |
MoveFileEx | Moves an existing file or a directory. |
MoveFileWithProgress | Moves a file or directory. |
PostQueuedCompletionStatus | Posts an I/O completion packet to an I/O completion port. |
QueryDosDevice | Retrieves information about MS-DOS device names. |
ReadDirectoryChangesW | Retrieves information describing the changes occurring within a directory. |
ReadFile | Reads data from a file, starting at the specified position. |
ReadFileEx | Reads data from a file asynchronously. |
ReadFileScatter | Reads data from a file and stores the data into a set of buffers. |
RemoveDirectory | Deletes an existing empty directory. |
ReplaceFile | Replaces one file with another file. |
SearchPath | Searches for the specified file. |
SetCurrentDirectory | Changes the current directory for the current process. |
SetEndOfFile | Moves the end-of-file position for the specified file. |
SetFileApisToANSI | Causes the file I/O functions to use the ANSI character set code page. |
SetFileApisToOEM | Causes the file I/O functions to use the OEM character set code page. |
SetFileAttributes | Sets a file‘s attributes. |
SetFilePointer | Moves the file pointer of an open file. |
SetFilePointerEx | Moves the file pointer of an open file. |
SetFileSecurity | Sets the security of a file or directory object. |
SetFileShortName | Sets the valid data length of the specified file. |
SetFileValidData | Sets the valid data length of the specified file. |
SetVolumeLabel | Sets the label of a file system volume. |
UnlockFile | Unlocks a previously locked region in an open file. |
UnlockFileEx | Unlocks a previously locked region in an open file. |
WriteFile | Writes data to a file. |
WriteFileEx | Writes data to a file asynchronously. |
WriteFileGather | Gathers data from a set of buffers and writes the data to a file. |
举个创建或打开文件的例子吧,
<span style="font-size:14px;">HANDLE T_FileOpen_Win32(const char *filename, int oflag, int mode) { int ret = 0; HANDLE Handle = INVALID_HANDLE_VALUE; WCHAR tFileName[WTP_FULL_FILENAME_LEN+1]={0}; char apiFileName[WTP_FULL_FILENAME_LEN+1]={0}; strcat(apiFileName,"\\\\\?\\"); strcat(apiFileName,filename); ret = MultiByteToWideChar (CP_ACP, 0, apiFileName, strlen (apiFileName) + 1, tFileName, sizeof(tFileName)/sizeof(tFileName[0])) ; Handle = CreateFileW(tFileName, mode,FILE_SHARE_READ,NULL,oflag,FILE_ATTRIBUTE_NORMAL,NULL); ret = GetLastError(); return Handle; }</span>
如何使用呢?
1)创建或打开文件
logFileFd = T_FileOpen_Win32(transLogFileFullName,OPEN_ALWAYS,GENERIC_WRITE|GENERIC_READ);
2)只打开文件
logFileFd = T_FileOpen_Win32(transLogFileFullName,OPEN_EXISTING,GENERIC_WRITE|GENERIC_READ);
※喜欢编程开发的朋友,可以加入到“StudyRoad“QQ群(238798556)来交流,认识新朋友,开阔视野,共同提高哦!※
如何访问超长文件