2011-11-29 22 views
6

मैं एक तरह से एक जावा अनुप्रयोग में एक अद्वितीय फ़ाइल id पाने के लिए देख रहा हूँ, और इस में आए:जावा के साथ विंडोज में अद्वितीय फ़ाइल आईडी प्राप्त करें?

Unique file identifier in windows

अब, मैं इस सवाल का जवाब एशले खुद हेंडरसन (एक है कि पूछा द्वारा आपूर्ति की कोशिश की सवाल), और यह सी # में ठीक काम किया। लेकिन ऐप को प्लेटफॉर्म पर काम करने के लिए, जावा में ऐसा करने की ज़रूरत है।

क्या जावा को पोर्ट करने का कोई तरीका है, या किसी अन्य आईडी को किसी अन्य तरीके से प्राप्त करना है?

संपादित करें:

मैं लगभग यह अब काम, EEE से समाधान का उपयोग, केवल मैं इसे जरूरत है एक पुस्तकालय में हो सकता है, और जब मैं एक पुस्तकालय के रूप में यह संकलन मैं कोई त्रुटि मिलती है, भले ही सब कुछ है मिल गया सब कुछ शामिल के साथ एक परीक्षण आवेदन में ठीक काम कर रहा है। लेकिन एक अलग पुस्तकालय है कि मैं आयात करने के लिए (कोई संकलक त्रुटियों) की कोशिश के साथ मैं इस रनटाइम त्रुटि मिलती है:

debug: 
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/Structure 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    at winfileid.FileId.getFileId(FileId.java:37) 
    at testfileid.TestFileId.main(TestFileId.java:19) 
Caused by: java.lang.ClassNotFoundException: com.sun.jna.Structure 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    ... 14 more 
Java Result: 1 
BUILD SUCCESSFUL (total time: 0 seconds) 

मैं jna.jar और पुस्तकालय में platform.jar शामिल किया है जब मैं इसे संकलित ... कृपया ध्यान दें कि मैं जावा के लिए बहुत नया हूं, लेकिन मैं गलत क्या कर रहा हूं?

+1

मुझे आपको संदेह है इसे प्राप्त करने के लिए जेएनआई का उपयोग करना होगा। आप इस जानकारी को वैसे भी क्यों चाहेंगे? – jontro

+0

उपयोग केस क्या है - आपको अद्वितीय आईडी क्यों चाहिए? – aishwarya

+0

उपयोग का मामला अन्य फ़ाइलों से लिंक को संरक्षित करने के लिए फ़ाइलों को ट्रैक या रखे जाने पर ट्रैक करना है। – Anders

उत्तर

4

JNA संस्करण 3.3.0 का उपयोग करना:

Kernel32.INSTANCE.GetFileInformationByHandle टेस्ट मामला:

package win.test; 

import com.sun.jna.platform.win32.Kernel32; 
import com.sun.jna.platform.win32.WinBase; 
import com.sun.jna.platform.win32.WinBase.FILETIME; 
import com.sun.jna.platform.win32.WinNT.HANDLE; 

import win.test.Kernel32.BY_HANDLE_FILE_INFORMATION; 


public class FileTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     //http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx 
     final int FILE_SHARE_READ = (0x00000001); 
     //final int FILE_SHARE_WRITE = (0x00000002); 
     //final int FILE_SHARE_DELETE = (0x00000004); 
     final int OPEN_EXISTING = (3); 
     final int GENERIC_READ = (0x80000000); 
     //final int GENERIC_WRITE = (0x40000000); 
     //final int FILE_FLAG_NO_BUFFERING = (0x20000000); 
     //final int FILE_FLAG_WRITE_THROUGH = (0x80000000); 
     //final int FILE_READ_ATTRIBUTES = (0x0080); 
     //final int FILE_WRITE_ATTRIBUTES = (0x0100); 
     //final int ERROR_INSUFFICIENT_BUFFER = (122); 
     final int FILE_ATTRIBUTE_ARCHIVE = (0x20); 

     WinBase.SECURITY_ATTRIBUTES attr = null; 
     BY_HANDLE_FILE_INFORMATION lpFileInformation = new BY_HANDLE_FILE_INFORMATION(); 
     HANDLE hFile = null; 

     hFile = Kernel32.INSTANCE.CreateFile(args[0], GENERIC_READ, FILE_SHARE_READ, attr, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, null); 

     System.out.println("CreateFile last error:" + Kernel32.INSTANCE.GetLastError()); 

     //if (hFile. != -1) 
     { 

      win.test.Kernel32.INSTANCE.GetFileInformationByHandle(hFile, lpFileInformation); 

      System.out.println("CREATION TIME: " + FILETIME.filetimeToDate(lpFileInformation.ftCreationTime.dwHighDateTime, lpFileInformation.ftCreationTime.dwLowDateTime)); 

      System.out.println("VOLUME SERIAL NO.: " + Integer.toHexString(lpFileInformation.dwVolumeSerialNumber.intValue())); 

      System.out.println("FILE INDEX HIGH: " + lpFileInformation.nFileIndexHigh); 
      System.out.println("FILE INDEX LOW: " + lpFileInformation.nFileIndexLow); 


      System.out.println("GetFileInformationByHandle last error:" + Kernel32.INSTANCE.GetLastError()); 
     } 

     Kernel32.INSTANCE.CloseHandle(hFile); 

     System.out.println("CloseHandle last error:" + Kernel32.INSTANCE.GetLastError()); 

    } 

} 

नमूना उत्पादन:

CreateFile last error:0 
CREATION TIME: Tue Nov 29 22:24:04 SGT 2011 
VOLUME SERIAL NO.: 900c0655 
FILE INDEX HIGH: 1769472 
FILE INDEX LOW: 286306 
GetFileInformationByHandle last error:0 
CloseHandle last error:0 

Kernel32 JNA उदाहरण वर्ग:

package win.test; 

import java.util.HashMap; 
import java.util.Map; 

import com.sun.jna.Library; 
import com.sun.jna.Native; 
import com.sun.jna.Pointer; 
import com.sun.jna.Structure; 
import com.sun.jna.WString; 
import com.sun.jna.platform.win32.WinBase.FILETIME; 
import com.sun.jna.platform.win32.WinDef.DWORD; 
import com.sun.jna.platform.win32.WinNT.HANDLE; 
import com.sun.jna.win32.StdCallLibrary; 
import com.sun.jna.win32.W32APIFunctionMapper; 
import com.sun.jna.win32.W32APITypeMapper; 

public interface Kernel32 extends StdCallLibrary { 
    final static Map<String, Object> WIN32API_OPTIONS = new HashMap<String, Object>() { 
     private static final long serialVersionUID = 1L; 
     { 
      put(Library.OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE); 
      put(Library.OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE); 
     } 
    }; 

    public Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", Kernel32.class, WIN32API_OPTIONS); 

    public int GetLastError(); 

    /** 
    typedef struct _BY_HANDLE_FILE_INFORMATION { 
      DWORD dwFileAttributes; 
      FILETIME ftCreationTime; 
      FILETIME ftLastAccessTime; 
      FILETIME ftLastWriteTime; 
      DWORD dwVolumeSerialNumber; 
      DWORD nFileSizeHigh; 
      DWORD nFileSizeLow; 
      DWORD nNumberOfLinks; 
      DWORD nFileIndexHigh; 
      DWORD nFileIndexLow; 
     } BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION; 
    */ 

    public class BY_HANDLE_FILE_INFORMATION extends Structure { 
     public DWORD dwFileAttributes; 
     public FILETIME ftCreationTime; 
     public FILETIME ftLastAccessTime; 
     public FILETIME ftLastWriteTime; 
     public DWORD dwVolumeSerialNumber; 
     public DWORD nFileSizeHigh; 
     public DWORD nFileSizeLow; 
     public DWORD nNumberOfLinks; 
     public DWORD nFileIndexHigh; 
     public DWORD nFileIndexLow; 
     public static class ByReference extends BY_HANDLE_FILE_INFORMATION implements Structure.ByReference { 

     }; 
     public static class ByValue extends BY_HANDLE_FILE_INFORMATION implements Structure.ByValue { 

     };   
    }; 

    /** 
    BOOL WINAPI GetFileInformationByHandle(
       __in HANDLE hFile, 
       __out LPBY_HANDLE_FILE_INFORMATION lpFileInformation 
      ); 
    */ 
    boolean GetFileInformationByHandle(
       HANDLE hFile, 
       BY_HANDLE_FILE_INFORMATION lpFileInformation 
      ); 
} 
+0

वाह देखें, उस विस्तृत उत्तर के लिए धन्यवाद ...! जैसा कि मैंने उल्लेख किया है, हालांकि, यह मेरे सिर से थोड़ा ऊपर है, और मैं बूट करने के लिए पूरी तरह से नया हूं, केवल सी # में प्रोग्राम किया गया है। लेकिन मुझे यह अब आज़माकर देना है कि आपने इतना विस्तृत उदाहरण प्रदान किया है ... लेकिन मुझे समझ में नहीं आता कि आप कहां फाइल को चेक करते हैं? यह शायद वहां पर है, लेकिन मेरे लिए इसे डीकोड करना मुश्किल है। इसके अलावा, FILE INDEX उच्च बनाम FILE INDEX कम क्या है? उदाहरण में मैंने (लिंक से) केवल एक इंडेक्स वैल्यू इस्तेमाल किया था, इसलिए फ़ाइल का पहचान करने के लिए मुझे यहां किस का उपयोग करना चाहिए? – Anders

+0

बीटीडब्ल्यू, चूंकि जेएनए डीएलएस में देशी कोड तक पहुंचने के लिए प्रतीत होता है, इसलिए उदाहरण लिंक में कोड को संकलित करके ऐसा करने का कोई तरीका नहीं है (जो कि पहले से ही सी # काम कर रहा है) एक डीएल में है, और फिर उसे कॉल करें जेएनए के साथ? यदि यह है तो मैं वास्तव में एक साधारण उदाहरण की सराहना करता हूं ... मैं बस उम्मीद कर रहा था कि यह आसान हो सकता है। – Anders

+0

@AndersSvensson हाँ, आप ऐसा कर सकते हैं लेकिन सी/सी ++ डीएलएल की बजाय सी # डीएलएल से शुरू होने के बाद से यह थोड़ा मुश्किल है, जो बाद में जेएनए में पसंदीदा डीएलएल कॉलिंग सम्मेलन है। जेएनए के साथ इसका उपयोग करने से पहले आपको अपने सी # डीएलएल को सी/सी ++ डीएलएल में लपेटने की जरूरत है। जेएनए के साथ मैं यही समझ सकता हूं। – ecle

0

क्या आप फ़ाइल पथ का उपयोग अपनी अद्वितीय आईडी के रूप में नहीं कर सकते?

पूर्ण फ़ाइल पथ काफी अद्वितीय है ...

+3

हां, यह अद्वितीय है - लेकिन जब आप किसी फ़ाइल को दूसरी निर्देशिका में ले जाते हैं, तो यह संरक्षित नहीं होता है, जो फ़ाइल आईडी के पीछे का इरादा प्रतीत होता है। –

+0

सही, बिंदु फ़ाइलों को चारों ओर स्थानांतरित करने और स्वतंत्र रूप से उनका नाम बदलने में सक्षम होना है, इसलिए फाइल पथ वास्तव में ऐसे कदम या नाम के बाद मुझे पता लगाना चाहिए। – Anders

1

जावा में आप JNI, देशी सी संकलन, दोनों विंडोज के लिए (सी # कोड का उपयोग कर), और यूनिक्स/लिनक्स के लिए (एक फ़ाइल के आईनोड का उपयोग कर की आवश्यकता होगी)। ईमानदारी से मुझे नहीं लगता कि यह बहुत सुरक्षित है।

+0

+1 उपयोग में फाइल सिस्टम भी महत्वपूर्ण है, पोर्टेबिलिटी को और अधिक कठिन बनाना - उदाहरण के लिए एफएटी पर शुभकामनाएँ :) –

+0

हां, मैंने संक्षेप में उसमें देखा, और उम्मीद कर रहा था कि एक आसान तरीका होगा। लेकिन मैं उम्मीद कर रहा था कि इसे संकलित न करें और जावा में इसका उपयोग न करें, बल्कि यदि एक ही आईडी पर जाने के लिए जावा में इसे फिर से लिखने का कोई तरीका था ... * nix में फ़ाइल आईडी प्राप्त करना बहुत आसान है, लेकिन मुझे सी # में इस उदाहरण को छोड़कर विंडोज के लिए ऐसा करने का कोई तरीका नहीं मिल रहा है। बीटीडब्ल्यू, एफएटी कोई मुद्दा नहीं है। यह विंडोज़ में एनटीएफएस होने जा रहा है, और मैक ओएस एक्स अन्य ओएस है जिसे मुझे विचार करने की आवश्यकता है। – Anders

+0

मेरा जेएनए समाधान – ecle

संबंधित मुद्दे