2023-01-20 355
在寻找如何做到这一点时,我发现了一些关于不同选项的模糊讨论,例如JNI vs JNA,但在具体示例中并不多.
上下文:如果java的File.renameTo()无法完成工作(无论出于何种原因; 有点问题),我想回到直接使用此本机Windows函数,该函数在kernel32.dll中定义(来自此答案):
)
BOOL WINAPI MoveFile(
__in LPCTSTR lpExistingFileName,
__in LPCTSTR lpNewFileName
);
因此,使用任何方法,您将如何从Java代码中调用该函数?我正在寻找最简单的方式,最少的非Java代码或额外的步骤(例如,在编译或部署中).
如果您与JNA一起使用,请考虑调用 MoveFilew 直接 – 它保存了必须提供配置信息以在Unicode和ANSI调用之间进行选择.
import java.io.*;
import com.sun.jna.*;
public class Ren {
static interface Kernel32 extends Library {
public static Kernel32 INSTANCE = (Kernel32) Native
.loadLibrary("Kernel32", Kernel32.class);
public static int FORMAT_MESSAGE_FROM_SYSTEM = 4096;
public static int FORMAT_MESSAGE_IGNORE_INSERTS = 512;
public boolean MoveFileW(WString lpExistingFileName,
WString lpNewFileName);
public int GetLastError();
public int FormatMessageW(int dwFlags,
Pointer lpSource, int dwMessageId,
int dwLanguageId, char[] lpBuffer, int nSize,
Pointer Arguments);
}
public static String getLastError() {
int dwMessageId = Kernel32.INSTANCE.GetLastError();
char[] lpBuffer = new char[1024];
int lenW = Kernel32.INSTANCE.FormatMessageW(
Kernel32.FORMAT_MESSAGE_FROM_SYSTEM
| Kernel32.FORMAT_MESSAGE_IGNORE_INSERTS, null,
dwMessageId, 0, lpBuffer, lpBuffer.length, null);
return new String(lpBuffer, 0, lenW);
}
public static void main(String[] args) throws IOException {
String from = ".\\from.txt";
String to = ".\\to.txt";
new FileOutputStream(from).close();
if (!Kernel32.INSTANCE.MoveFileW(new WString(from),
new WString(to))) {
throw new IOException(getLastError());
}
}
}
编辑:检查代码后我已经编辑了答案 – 我误以为在签名中使用char [] – 最好使用 wstring .
如果这确实是必要的(Renameto不起作用,您可以肯定会MoveFile),我会使用 jna .看来大多数工作已经在com.mucommander.file.util. java” rel =” nofollow noreferrer”> kernel32.java / kernel32api.java .
基于 nativecall库我做了以下 poc应用程序.
它使用 kernel32.dll
的MoveFileA函数
它作为run.bat和所有jar和dll的完整工作样本.
它将随附的test.txt移至test2.txt
如果您不喜欢nativeCall库版本,我做了另一个 POC应用程序基于/基于 java本机访问(JNA)库.这次MoveFileA和MoveFileW被实现并演示.
以上所述是小编给大家介绍的从Java中调用Windows内核函数的最简单方法是什么?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25911.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态