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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
MC

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

#1

投稿記事 by MC » 9年前

お世話になります。
とあるサイトで、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;
};


YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

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

#2

投稿記事 by YuO » 9年前

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を参照してください。

Mc

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

#3

投稿記事 by Mc » 9年前

YuO様
ご返信、ご回答、ありがとうございます。
教えていただいた方法で実現できました。
                                以上

閉鎖

“C言語何でも質問掲示板” へ戻る