2011-12-12 14 views
23

मैंने एक फ़ाइल वॉचर लागू किया लेकिन मैंने देखा कि जावा एनओओ फाइल वॉचर मैप किए गए ड्राइव पर कॉपी की जा रही फ़ाइलों के लिए ईवेंट उत्पन्न नहीं करता है। उदाहरण के लिए, मैंने स्थानीय निर्देशिका (/sharedfolder) देखने के लिए यूनिक्स पर फ़ाइल वॉचर चलाया है जो विंडोज़ (H:\) पर मैप किया गया है, और फिर मैंने इस निर्देशिका में एक फ़ाइल डाली है (H:\) लेकिन फ़ाइल वॉचर में नहीं है किसी भी घटना उत्पन्न किया। अब अगर मैं मैप किए गए ड्राइव (H:\) को देखने के लिए विंडोज़ पर फ़ाइल वॉचर चलाता हूं जो यूनिक्स पथ (/sharedfolder) को संदर्भित करता है और यूनिक्स से मैंने इस फ़ोल्डर में एक फाइल डाली है, तो फाइल वॉचर परिवर्तन की पहचान करता है और एक ईवेंट उत्पन्न करता है। यह एक बग की तरह दिखता है, या हो सकता है कि मुझे कुछ चीज़ याद आ रही है, कोई विचार?जावा वॉच सर्विस मैप किए गए ड्राइव को देखते हुए ईवेंट उत्पन्न नहीं कर रहा है

उत्तर

4

जेडीके में फ़ाइल देखने की कार्यक्षमता प्लेटफॉर्म पर निर्भर है क्योंकि यह मूल पुस्तकालयों का उपयोग करती है ताकि यह विभिन्न प्लेटफॉर्म पर अलग-अलग व्यवहार कर सके। मुझे आश्चर्य है कि यह नेटवर्क ड्राइव के लिए बिल्कुल काम करता है - विंडोज़ परिवर्तनों के लिए नेटवर्क मैप किए गए ड्राइव को मतदान करना होगा जबकि लिनक्स नहीं करता है (ठीक है तो मुझे कहना चाहिए)।

आमतौर पर ओएस कर्नेल में कार्यान्वित इस प्रकार की निगरानी, ​​जो स्पष्ट रूप से ज्ञान है कि कौन सी फाइलें स्थानीय रूप से संशोधित/बनाई गई/आदि हैं, लेकिन नेटवर्क ड्राइव पर क्या हो रहा है, यह जानने के लिए ओएस के लिए कोई आसान तरीका नहीं है क्योंकि इसमें विशेष नियंत्रण नहीं है इस पर।

+0

हाँ, लेकिन जो निर्देशिका मैं देख रहा हूं वह उसी मशीन पर है जिस पर मैं अपना वॉचर चला रहा हूं। तो या तो नेटवर्क के माध्यम से या स्थानीय मशीन पर स्थानांतरण किया जाता है, ओएस को इसके बारे में पता होना चाहिए, अन्यथा हस्तांतरण कैसे किया जा सकता है। यह समझ में आता है कि खिड़कियां मैप किए गए ड्राइव को मतदान कर रही हैं, लेकिन मुझे समझ में नहीं आता कि यूनिक्स स्थानीय फ़ोल्डर पर नेटवर्क के माध्यम से किए गए परिवर्तनों से कैसे अवगत नहीं हो सकता था। – Ramcis

+0

@ रैमिसिस: लिनक्स नेटवर्क शेयरों पर एनएफएस और एनएफएस के माध्यम से घुड़सवार एक राज्य-कम प्रोटोकॉल डिज़ाइन किया गया है। इसलिए सर्वर यह नहीं जानता कि कितने ग्राहक फाइल को एक्सेस कर रहे हैं। डिजाइन में कुछ फायदे हैं (उदा। कम ओवरहेड) और कुछ कमियां ... – Robert

1

मुझे एक पाइथन स्क्रिप्ट के साथ रिमोट विंडोज निर्देशिका पर लॉग फ़ाइल की सामग्री देखने के समान समस्याएं थीं।

मेरा उत्तर यहां है।

जब यूनिक्स से दूरस्थ ड्राइव मानचित्रण, /etc/fstab उपयोग //xxx.xxx.xxx.xxx/shareddrive /media/shareddrive cifs username=xxxx,password=xxxx,**directio** 0 0

आप उपयोग कर सकते हैं एक साख सादे पाठ में पासवर्ड से बचने के लिए फाइल में।

आदेश यूनिक्स संस्करण के आधार पर बदल सकता है, यह डेबियन के तहत परीक्षण किया गया था। इसे इरादे के रूप में काम करना चाहिए। क्या आप मुझे बता सकते हैं कि यह काम करता है? मैं जावा में एक ही सामान को लागू करने की योजना बना रहा हूं, इसलिए उत्तर मेरे लिए भी उपयोगी हो सकता है।

+0

यह अब बीटीडब्ल्यू काम नहीं करता है। मुझे लगता है कि यह कुछ हद तक चंचल तरीके से काम करता था (वुबू में वैसे भी), लेकिन हाल के अपडेट के बाद यह पूरी तरह से काम करना बंद कर दिया। मैंने अपने भयानक काम का वर्णन करने के लिए एक जवाब जोड़ा। – rubyruy

20

मेरे पास सीआईएफएस के माध्यम से एक घुड़सवार विंडोज शेयर देखने की कोशिश करने का एक ही मुद्दा है। filesystem events for CIFS mounts प्राप्त करना संभव नहीं है।

जावा 7 एनआईओ फ़ाइलवाटर का लिनक्स कार्यान्वयन inotify का उपयोग करता है। Inotify फाइल सिस्टम परिवर्तनों को नोटिस करने के लिए एक लिनक्स कर्नेल सबसिस्टम है जो स्थानीय निर्देशिकाओं के लिए सही काम करता है, लेकिन स्पष्ट रूप से CIFS mounts के लिए नहीं।

ओरेकल में, यह उच्च प्राथमिकता this bug ठीक करने के लिए होने के लिए प्रतीत नहीं होता। (क्या यह उनकी ज़िम्मेदारी है? ओएस मुद्दे का अधिक ...)

JNotify लिनक्स सिस्टम पर इनोटिफा का उपयोग करता है, इसलिए यह कोई विकल्प नहीं है।

तो मैप की ड्राइव निगरानी दुर्भाग्य pollers तक ही सीमित किया जा रहा है:

  • Apache VFS DefaultFileMonitor निर्देशिका (घुड़सवार शेयर) मानक जावा API पर आधारित
  • फ़ाइल Poller सर्वेक्षण करना।jCIFS साथ
  • कस्टम फ़ाइल Poller क्योंकि यह फ़ाइल निर्माण, अद्यतन पता लगाता है और से बाहर हटाता है,

मैं शायद अपाचे वीएफएस मॉनिटर कोशिश करता हूँ (ताकि शेयर मेजबान पर लगाए जाने की जरूरत नहीं है) डिब्बा। इसे शेयर को माउंट करने की आवश्यकता है, लेकिन यह ओएस को सीआईएफएस कनेक्शन की ज़िम्मेदारी देता है, न कि मेरे आवेदन।

1

मैं भी इसमें भाग गया और उसी निष्कर्ष पर पहुंचा क्योंकि यहां हर कोई (सीआईएफएस + इनोटिफी = नहीं जाना)।

हालांकि, बाद से मेरी कार्यप्रवाह दोनों दूरस्थ माउंट पर निर्भर हुआ और ऑटो संकलन उपकरण है कि inotify पर भरोसा करते हैं, मैं एक (काफी हताश & hacky) समाधान जो मूल रूप से सिर्फ मतदान का उपयोग करता है परिवर्तन और उसके बाद स्पर्श के लिए देखने के लिए का निर्माण समाप्त हो गया घुड़सवार तरफ एक ही फाइलें, जो इनोटिफ़ाई घटनाओं को बंद करने लगती है। यह मेरा गर्व का क्षण नहीं है।

कहा करने के बाद कि, यह काम करता है, इसलिए, का आनंद लें: http://github.com/rubyruy/watchntouch

1

मैं एक ही समस्या थी। मैंने इसे मुख्य वर्ग में एक नया धागा बनाकर और समय-समय पर फ़ाइलों को छूकर हल किया है ताकि एक नया परिवर्तन कार्यक्रम निकाल दिया जा सके।

प्रत्येक 10 सेकंड के लिए डीआईआर नमूना चुनाव स्पर्श करता है।

package com.ardevco.files; 

import java.io.IOException; 
import java.nio.file.DirectoryStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.attribute.FileTime; 
import java.util.ArrayList; 
import java.util.List; 

public class Touch implements Runnable { 

    private Path touchPath; 

    public Touch(Path touchPath) { 
     this.touchPath = touchPath; 
     this.checkPath = checkPath; 

    } 

    public static void touch(Path file) throws IOException { 
     long timestamp = System.currentTimeMillis(); 
     touch(file, timestamp); 
    } 

    public static void touch(Path file, long timestamp) throws IOException { 
     if (Files.exists(file)) { 
      FileTime ft = FileTime.fromMillis(timestamp); 
      Files.setLastModifiedTime(file, ft); 
     } 
    } 

    List<Path> listFiles(Path path) throws IOException { 
     final List<Path> files = new ArrayList<>(); 
     try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) { 
      for (Path entry : stream) { 
       if (Files.isDirectory(entry)) { 
        files.addAll(listFiles(entry)); 
       } 
       files.add(entry); 
      } 
     } 
     return files; 
    } 

    @Override 
    public void run() { 
     while (true) { 
      try { 
       for (Path path : listFiles(touchPath)) { 
        touch(path); 
       } 
      } catch (IOException e) { 
       System.out.println("Exception: " + e); 
      } 

      try { 
       Thread.sleep(10000L); 
      } catch (InterruptedException e) { 
       System.out.println("Exception: " + e); 
      } 
     } 

    } 

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

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