ページ 11

255文字を超えるファイル名は扱えるのか?

Posted: 2016年4月22日(金) 18:23
by MC
お世話になります。
とあるサイトで、UNICODE版のAPIであれば255文字を超えるファイル名を扱える
との記載を見ました。そこで、ファイルのタイムスタンプを取得するアプリを
VC++(Unicode)で以下のように作ってみたのですが
CreateFileWの部分でエラーになりました。
255文字を超えるファイル名を扱うにはどうすればよいでしょうか。
※255文字以下に抑えるべき、は置いといて、技術的に可能か知りたいです。

以上、よろしくお願いします。

コード:

BOOL myGetFileTime(TCHAR *filename,
	LPFILETIME lpC,
	LPFILETIME lpA,
	LPFILETIME lpW
	);

int main() {
	FILETIME ftC, ftA, ftR, ftl;
	SYSTEMTIME st;
	ULARGE_INTEGER ui;

	if (    !myGetFileTime(T"\\\\192.168.1.3\\c$\\aaa・・・aa.txt", //255文字オーバー
		&ftC,
		&ftA,
		&ftR)) {
		perror("File does not exist\n");
		return 0;
	};
	return 0;
}

BOOL myGetFileTime(TCHAR *filename,
	LPFILETIME lpC,
	LPFILETIME lpA,
	LPFILETIME lpW
	)
{
	HANDLE hFile;

	hFile = ::CreateFileW(filename,
		GENERIC_READ,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		0);

	if (hFile == INVALID_HANDLE_VALUE) {
		/* failed to open the file */
		return FALSE;
	}
	else {
		/* get time */
		::GetFileTime(hFile,
			lpC,
			lpA,
			lpW);
	}
	::CloseHandle(hFile);
	return TRUE;
};


Re: 255文字を超えるファイル名は扱えるのか?

Posted: 2016年4月22日(金) 21:15
by YuO
CreateFile functionに書いてあるとおり、
In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\\?\" to the path.
\\?\をファイル名に前置してやればよいです。
ただし,UNCでは\\?\UNC\を先頭の\\の代わりにするとか,".\"等を挟めないなどの条件があります。
詳しくは,CreateFileのMSDNにもリンクがある,Naming Files, Paths, and Namespacesを参照してください。

Re: 255文字を超えるファイル名は扱えるのか?

Posted: 2016年4月22日(金) 22:33
by Mc
YuO様
ご返信、ご回答、ありがとうございます。
教えていただいた方法で実現できました。
                                以上