码迷,mamicode.com
首页 > 其他好文 > 详细

如何访问超长文件

时间:2014-08-14 20:41:53      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:c   win32   超长文件名   createfilew   

    现在,又回归到代码编写了。
    其实,安安静静地享受编码的过程,是一个很美好的旅程,从此以后,就尽情享受这一过程吧。
    现在,就遇到了在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)来交流,认识新朋友,开阔视野,共同提高哦!※

如何访问超长文件,布布扣,bubuko.com

如何访问超长文件

标签:c   win32   超长文件名   createfilew   

原文地址:http://blog.csdn.net/pony12/article/details/38562243

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!