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());
}
}
}
編集:私は、コードを確認した後に私の答えを編集した - 私は、署名に[]文字の使用について間違っていた - WStringを使用することをお勧めします。
しかし、* MoveFileWを直接呼び出す方法は? Matthew Flaschenが示唆するように、または何を?サンプルコードのいくつかの行(Native.loadLibrary()などの使い方など)は高く評価されます。 – Jonik
私の実例をチェックしましたか? – jitter
JNAの例をありがとう! Btw、インターフェイスはMoveFileA(ジッタの回答で言及されている)のためにどのように見えるでしょうか?単に "MoveFileW"の代わりに "MoveFileA"を使用するだけでいいわけではありませんでした。私は実際にディレクトリを移動/名前を変更しようとしていますが、これで作業することはできませんでしたが、それがMoveFileWなのか他のものなのかわかりません。 – Jonik