我正在尝试通过 java 创建一个desk.ini文件,为 Windows11 文件夹提供一个备用名称(就像我的文档那样)。
下面是一个简单的代码示例(直接调用运行即可):
@Test
public void createDesktopIni() throws IOException {
String folderPath = Write a folder path here;
String iniPath = folderPath + "\\desktop.ini";
File file = new File(iniPath);
// delete and recreate if exist
if (file.exists()) {
file.delete();
}
file.createNewFile();
// Write content
String alternativeName = "Alternative Name";
//alternativeName = "这是一个中文别名";
OutputStreamWriter oStreamWriter = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_16LE);
oStreamWriter.write("[.ShellClassInfo]\nLocalizedResourceName = " + alternativeName);
oStreamWriter.flush();
oStreamWriter.close();
// Set system attribute
Files.setAttribute(Paths.get(folderPath), "dos:system", true, LinkOption.NOFOLLOW_LINKS);
Files.setAttribute(Paths.get(iniPath), "dos:system", true, LinkOption.NOFOLLOW_LINKS);
Files.setAttribute(Paths.get(iniPath), "dos:hidden", true, LinkOption.NOFOLLOW_LINKS);
}
如果我设置一个英文替代名称,desktop.ini就可以正常工作了。(顺便说一下,此时这个文件可以通过 VSCode 正常打开)。
但是,如果我设置一个中文替代名称,例如评论:
alternativeName = "这是一个中文别名";
此时desktop.ini文件无法起作用。
但是,如果我选择“仍然打开”->“使用 UTF-16 LE 编码重新打开”,然后通过 VS Code 将文件保存为 UTF-16 LE,它就可以再次正常工作。
以下是我尝试过的一些其他编码:
- UTF-8 可以工作,但是中文在 Explorer.exe 中会显示乱码。
- GBK 可以,而且不会乱码。但我更喜欢用 UTF-16,我看到我的文档文件夹中的desktop.ini也是用 UTF-16 LE。
- UTF-16 不起作用,文件将被编码为 UTF-16 BE。
包含 Unicode 字符的文件
Desktop.ini
(或实际上是 Windows 上的任何 INI 文件)必须以 UTF-16 BOM开头,这样 Win32 API 才知道内容是 Unicode。但您不会生成 BOM,因为您使用的StandardCharsets.UTF_16LE
是无 BOM 的。您可以:
而是使用
StandardCharsets.UTF_16
具有 BOM(但可能是 UTF-16 LE 或 BE)的格式:继续使用
UTF_16LE
并在进行其他操作之前手动编写 BOM: