以前一直关注这个但是一直没有跑出来一个例子, 后来在朋友的问题中找到了这个网页
转载:http://pet.iteye.com/blog/188313 终于明白了jni的用处了。呵呵!
Java获得文件创建时间
最近被文件创建时间搞的很郁闷,在CSDN和Javaeye上发贴问了很多高人,感慨跨平台的东西不一定就是最实用的.一个小小的时间字符串就要这么麻烦.
Java的File类只提供了一个获取文件最后一次修改时间的方法 lastModified().官方API中描述为"返回此抽象路径名表示的文件最后一次被修改的时间."
听听来自CSDN的声音:
Java的File类只提供了一个获取文件最后一次修改时间的方法 lastModified().官方API中描述为"返回此抽象路径名表示的文件最后一次被修改的时间."
听听来自CSDN的声音:
- "UNIX或LINUX平台下文件系统中就没有保存文件的创建时间,只有文件的最后修改的时间。否则的话,JAVA中File类就应该有支持这个属性的方法了."
- "在Linux中,没有文件创建时间的概念.只有文件的访问时间、修改时间、状态改变时间.也就是说不能知道文件的创建时间."
- "若LINUX下文件创建好以后全是文件读操作(没有执行过存盘操作),则取的文件修改时间就是文件创建的时间."
- "我想在LINUX下,就以修改时间为你的文件时间.如:只要不改文件就行. 方法:如要获取文件mydata.dat,则: 命令:ls --full-time mydata.dat 显示结果:-rw-r--r-- 1 root root 0 2008-04-26 22:47:50.000000000 +0800 mydata.dat 上边红色的就是你要的.你就用JAVA直接取吧.上述ls命令外,用的是最后修改时间,倒不如直接用JAVA的File类取最后修改时间了"
基于以上讨论,下面方法仅限于Windows平台.
通过Java JNI取得文件创建时间.需要用到VC++6.0.
[list]
- 在VC中创建一个Win32 Dynamic-Link Library工程MyFileTime
- 添加头文件MyFileTime.h,内容为
- #include <jni.h>
- /* Header for class MyFileTime */
- #ifndef _Included_MyFileTime
- #define _Included_MyFileTime
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: MyFileTime
- * Method: getFileCreationTime
- * Signature: (Ljava/lang/String;)Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_cn_imu_jni_MyFileTimegetFileCreationTime
- (JNIEnv *, jobject, jstring);
- #ifdef __cplusplus
- }
- #endif
- #endif
#include <jni.h> /* Header for class MyFileTime */ #ifndef _Included_MyFileTime #define _Included_MyFileTime #ifdef __cplusplus extern "C" { #endif /* * Class: MyFileTime * Method: getFileCreationTime * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_cn_imu_jni_MyFileTimegetFileCreationTime (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif
- 添加C++类文件MyFileTime.cpp,内容为
- #include <windows.h>
- #include "MyFileTime.h"
- JNIEXPORT jstring JNICALL Java_cn_imu_jni_MyFileTime_getFileCreationTime(JNIEnv *env, jobject cls, jstring FileName)
- {
- HANDLE hFile;
- FILETIME creationTime;
- FILETIME lastAccessTime;
- FILETIME lastWriteTime;
- FILETIME creationLocalTime;
- SYSTEMTIME creationSystemTime;
- jstring result;
- char fileTimeString[30];
- hFile = CreateFile((char *)env->GetStringUTFChars(FileName, 0), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
- if(hFile == INVALID_HANDLE_VALUE) return env->NewStringUTF("");
- if(GetFileTime(hFile, &creationTime, &lastAccessTime, &lastWriteTime))
- {
- if(FileTimeToLocalFileTime(&creationTime, &creationLocalTime))
- {
- if(FileTimeToSystemTime(&creationLocalTime, &creationSystemTime))
- {
- sprintf(fileTimeString,
- "%04d-%02d-%02d %02d:%02d:%02d/0",
- creationSystemTime.wYear,
- creationSystemTime.wMonth,
- creationSystemTime.wDay,
- creationSystemTime.wHour,
- creationSystemTime.wMinute,
- creationSystemTime.wSecond);
- result = env->NewStringUTF(fileTimeString);
- }
- else
- result = env->NewStringUTF("");
- }
- else
- result = env->NewStringUTF("");
- }
- else
- result = env->NewStringUTF("");
- CloseHandle(hFile);
- return result;
- }
#include <windows.h> #include "MyFileTime.h" JNIEXPORT jstring JNICALL Java_cn_imu_jni_MyFileTime_getFileCreationTime(JNIEnv *env, jobject cls, jstring FileName) { HANDLE hFile; FILETIME creationTime; FILETIME lastAccessTime; FILETIME lastWriteTime; FILETIME creationLocalTime; SYSTEMTIME creationSystemTime; jstring result; char fileTimeString[30]; hFile = CreateFile((char *)env->GetStringUTFChars(FileName, 0), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hFile == INVALID_HANDLE_VALUE) return env->NewStringUTF(""); if(GetFileTime(hFile, &creationTime, &lastAccessTime, &lastWriteTime)) { if(FileTimeToLocalFileTime(&creationTime, &creationLocalTime)) { if(FileTimeToSystemTime(&creationLocalTime, &creationSystemTime)) { sprintf(fileTimeString, "%04d-%02d-%02d %02d:%02d:%02d/0", creationSystemTime.wYear, creationSystemTime.wMonth, creationSystemTime.wDay, creationSystemTime.wHour, creationSystemTime.wMinute, creationSystemTime.wSecond); result = env->NewStringUTF(fileTimeString); } else result = env->NewStringUTF(""); } else result = env->NewStringUTF(""); } else result = env->NewStringUTF(""); CloseHandle(hFile); return result; }
- 编译工程,生成MyFileTime.dll文件
- 在Java项目的cn.imu.jni包中添加类MyFileTime,内容为
- package cn.imu.jni;
- public final class MyFileTime {
- /**
- * @param args
- */
- static {
- System.loadLibrary("MyFileTime");
- }
- private static native String getFileCreationTime(String fileName);
- public static String getCreationTime(String fileName) {
- return getFileCreationTime(fileName);
- }
- public static void main(String[] args) {
- System.out.println(MyFileTime.getCreationTime("c:/db.txt"));
- }
- }
package cn.imu.jni; public final class MyFileTime { /** * @param args */ static { System.loadLibrary("MyFileTime"); } private static native String getFileCreationTime(String fileName); public static String getCreationTime(String fileName) { return getFileCreationTime(fileName); } public static void main(String[] args) { System.out.println(MyFileTime.getCreationTime("c:/db.txt")); } }
[/list]
注意: - 头文件和类文件中的方法名中cn_imu_jni_MyFileTime字符串对应Java项目中的cn.imu.jni.MyFileTime,若包和类名不同,在C++代码中需要相应的更改.
- 如果在VC++中编译时遇到缺少jni.h和jni_md.h,可以在%JAVA_HOME%/include和%JAVA_HOME%/include/win32目录中找到,copy到Microsoft Visual Studio/VC98/Include目录中或放到VC能找到的classpath即可.