日期:2014-05-17  浏览次数:20969 次

JAVA按照最近访问时间输出windows文件系统目录的文件列表

  因为我在JWFDV0.97版本中要在流程设计器主菜单里面给出最近访问的5个流程图的列表,所以需要在JWFD中给出查找文件的最近访问时间的功能模块

  由于用JDK1.7以下的File类没有读取最近文件访问时间这个功能,因为在jdk1.6版本中,我们必须应用其它办法来实现这个功能
 
  这几天找啊找,在 chinaunix论坛上面找到一个JAVA通过jna访问windows文件系统访问时间的类文件,感谢无名的作者,我集成了一下,给出代码,方便大家引用。。。

读取windows文件系统的访问时间,修改时间,创建时间类


import java.io.*;
import java.nio.*;
import java.util.Date;

// Java Native Access: http://jna.dev.java.net
// Test with jna-3.2.7
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.*;
import com.sun.jna.platform.win32.*;


public class WindowsFileTime
{
        public static final int GENERIC_READ = 0x80000000;
        //public static final int GENERIC_WRITE = 0x40000000;        // defined in com.sun.jna.platform.win32.WinNT
        public static final int GENERIC_EXECUTE = 0x20000000;
        public static final int GENERIC_ALL = 0x10000000;

        // defined in com.sun.jna.platform.win32.WinNT
        //public static final int CREATE_NEW = 1;
        //public static final int CREATE_ALWAYS = 2;
        //public static final int OPEN_EXISTING = 3;
        //public static final int OPEN_ALWAYS = 4;
        //public static final int TRUNCATE_EXISTING = 5;

        public interface MoreKernel32 extends Kernel32
        {
                static final MoreKernel32 instance = (MoreKernel32)Native.loadLibrary ("kernel32", MoreKernel32.class, W32APIOptions.DEFAULT_OPTIONS);
                boolean GetFileTime (WinNT.HANDLE hFile, WinBase.FILETIME lpCreationTime, WinBase.FILETIME lpLastAccessTime, WinBase.FILETIME lpLastWriteTime);
                boolean SetFileTime (WinNT.HANDLE hFile, final WinBase.FILETIME lpCreationTime, final WinBase.FILETIME lpLastAccessTime, final WinBase.FILETIME lpLastWriteTime);
        }

        static MoreKernel32 win32 = MoreKernel32.instance;
        //static Kernel32 _win32 = (Kernel32)win32;

        static WinBase.FILETIME _creationTime = new WinBase.FILETIME ();
        static WinBase.FILETIME _lastWriteTime = new WinBase.FILETIME ();
        static WinBase.FILETIME _lastAccessTime = new WinBase.FILETIME ();

        static boolean GetFileTime (String sFileName, Date creationTime, Date lastWriteTime, Date lastAccessTime)
        {
                WinNT.HANDLE hFile = OpenFile (sFileName, GENERIC_READ);        // may be WinNT.GENERIC_READ in future jna version.
                if (hFile == WinBase.INVALID_HANDLE_VALUE) return false;

                boolean rc = win32.GetFileTime (hFile, _creationTime, _lastAccessTime, _lastWriteTime);
                if (rc)
                {
                        if (creationTime != null) creationTime.setTime (_creationTime.toLong());
                        if (lastAccessTime != null) lastAccessTime.setTime (_lastAccessTime.toLong());
                        if (lastWriteTime != null) lastWriteTime.setTime (_lastWriteTime.toLong());
                }
                else
                {
                        int iLastError = win32.GetLastError();
                        System.out.print ("获取文件时间失败,错误码:" + iLastError + " " + GetWindowsSystemErrorMessage (iLastError));
                }
                win32.CloseHandle (hFile);
                return rc;
        }
        static boolean SetFileTime (String sFileName, final Date creationTime, final Date lastWriteTime, final Date lastAccessTime)
        {
                WinNT.HANDLE hFile = OpenFile (sFileName, WinNT.GENERIC_WRITE);
                if (hFile == WinBase.INVALID_HANDLE_VALUE) return false;

                ConvertDateToFILETIME (creationTime, _creationTime);
                ConvertDateToFILETIME (lastWriteTime, _lastWriteTime);
                ConvertDateToFILETIME (lastAccessTime, _lastAccessTime);

                //System.out.println ("creationTime: " + creationTime);
                //System.out.println ("lastWriteTime: " + lastWriteTime);
                //System.o