如何获取未解码的文件名

时间:2010-12-06 09:05:18

标签: java c++ c

有人可以给我一些关于如何获取未解码的byte []文件名的提示吗? 我想自己做解码。 我已经跟踪了java src代码,但我被本机函数阻止了。 非常感谢!

我的意思是我想要文件名的原始byte [],而不是将其转换为字符串然后将其转换回来。这可能会导致某些文件名使用本机编码但不会使unicode丢失其原始字节。 JAVA总是给我unicode解码的文件名,我不想要它。

我假设我必须从某个地方处理一些文件,而且我并不完全知道它们使用的编码。但是,我只是不希望系统为我做解码。我想自己决定应该使用哪种解码方式。所以我需要文件名的原始byte []。

C / C ++中的解决方案也很受欢迎。

3 个答案:

答案 0 :(得分:1)

据我所知,标准Java API不提供任何方法来检索底层操作系统用作“本机”文件名的字节流;所有API都将文件名处理为java.lang.String,因此采用Unicode格式。

您当然可以使用String.getBytes将String转换回byte[],但这不会为您提供原始表示。我想要获得它的唯一方法是使用JNI和OS原生文件系统API。

实际上,在Windows上,这意味着您可以使用C / C ++代码获取文件名,并通过JNI调用它来获取“真实”文件名。

答案 1 :(得分:0)

很难说出你真正想要实现的目标。通常,如果我们使用文件,我们不会获取文件名,但提供文件名来访问文件。 filename 是一个字节序列,可以在给定的编码后转换为 String

要使用特殊编码创建字符串,请使用:

byte[] filenameBytes = getBytesFromWhereEver();
String filename = new String(filenameBytes, "UTF-8");

该示例将字节编码为UTF-8字符串。但是你仍然必须提供文件名,或者至少是它的字节。

答案 2 :(得分:0)

当我发表评论时,在c / c ++中它是微不足道的,我的意思是根据我的经验,c和c ++很少在没有被告知的情况下转换数据,你应该通过什么都不做就得到你想要的东西。

要获取文件名,我希望您必须迭代文件夹的内容。 执行此操作的两种方法是调用FindFirstFile(),然后调用FindNextFile

WIN32_FIND_DATA findData;
HANDLE findFile;
findFile = FindFirstFile (path, &findData);
FindNextFile (findFile, &findData);

wpath ourPath(pDirectory);
wdirectory_iterator endIter;
for (wdirectory_iterator iter(ourPath); iter != endIter; ++iter)
{
 pContents.push_back(iter->leaf());
}