2010-12-06 2 views
2

Может ли кто-нибудь, пожалуйста, дать мне несколько советов о том, как получить незакодированный байт [] имени файла? Я хочу сделать декодирование самостоятельно. Я проследил код java src, но я заблокирован функцией native. Спасибо большое!Как получить некодированное имя файла

Я имею в виду, что я хочу исходный байт [] имени файла, а не конвертировать его в строку и затем преобразовывать обратно. Это может привести к тому, что некоторые имена файлов, используя собственную кодировку, но не unicode, потеряют исходные байты. JAVA всегда дает мне имя файла, декодированное unicode, и я не хочу этого.

Я предполагаю, что мне приходится обрабатывать некоторые файлы откуда-то, и я точно не знаю кодировку, которую они используют. Однако я просто не хочу, чтобы система выполняла декодирование для меня. Я хочу решить, какой тип декодирования следует использовать. Поэтому мне нужен оригинальный байт [] имени файла.

Решение в C/C++ также приветствуется.

+1

неясный вопрос – 2010-12-06 09:10:11

+2

Определение "недекодированная". Нет простого текста. – 2010-12-06 09:10:42

ответ

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()); 
} 
0

Трудно сказать, чего вы действительно хотите достичь. Обычно, если мы работаем с файлами, мы не делаем , чтобы получить имена файлов, но предоставить имена файлов для доступа к файлам. A filename - это последовательность байтов, которая может быть преобразована в строку String после данной кодировки.

Чтобы создать строку в специальной кодировке, используйте:

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

пример будет кодировать байты в UTF-8 строки. Но все же вам нужно будет указать имя файла или, по крайней мере, это байты.

1

Насколько я знаю, стандартный Java API не предлагает способа получения потока байтов, который базовая ОС использует как «родное» имя файла; все API-интерфейсы обрабатывают имена файлов как java.lang.String s, следовательно, в Unicode.

Вы можете, конечно, конвертировать String обратно в byte[] с помощью String.getBytes, но это не даст вам оригинальное представление. Я предполагаю, что единственный способ получить это - использовать JNI и API-интерфейс файловой системы OS.

На практике в Windows это означает, что вы берете код C/C++ для получения имени файла и вызываете его через JNI для получения «реального» имени файла.

Смежные вопросы