दिलचस्प पोस्ट
सीएसएस चयनकर्ता में एक स्थान का क्या मतलब है? यानी .classA.classB और .classA के बीच अंतर क्या है .classB? सदिश का डेटा कैसे संरेखित है? मैं नए YouTube डेटा एपीआई (वी 3) के साथ एक निश्चित चैनल के लिए अपलोड किए गए वीडियो की एक सूची कैसे प्राप्त करूं? जावा में उपलब्ध कॉरलाइन लाइब्रेरीज़ MySQL में प्रत्येक समूह के लिए पहली पंक्ति का चयन कैसे करें? प्रोजेक्ट-स्विफ्ट एच को उद्देश्य-सी क्लास में आयात करना … फ़ाइल नहीं मिली पता लगा रहा है कि कोई ब्राउज़र निजी ब्राउज़िंग मोड का उपयोग कर रहा है अपनी स्वयं की फ़ंक्शन लिखते समय आर की एलीपिसिस सुविधा का उपयोग कैसे करें? मैं कैसे अच्छा / सही पैकेज __init__.py फ़ाइलें लिख सकता हूँ बैश स्क्रिप्ट – एक चर में स्टोर स्टेडरर समारोह को असतत मानों के रूप में दिए जाने पर ओडीई को सुलझाना -मेटलाब- इंटरनेट एक्सप्लोरर में addEventListener गेट से मैन्युअल रूप से HTTP अनुरोध भेजें कैसे RecyclerView स्क्रॉल स्थिति को बचाने के लिए RecyclerView.State का उपयोग? टूलटिप्स में लाइन ब्रेक जोड़ें

file.delete () भले ही file.exists (), file.canRead (), file.canWrite (), file.canExecute () सभी रिटर्न सच भी गलत रिटर्न

मैं फाइल को हटाने की कोशिश कर रहा हूं, इसमें कुछ लिखने के बाद, FileOutputStream साथ यह कोड मैं लिखने के लिए उपयोग करता हूं:

 private void writeContent(File file, String fileContent) { FileOutputStream to; try { to = new FileOutputStream(file); to.write(fileContent.getBytes()); to.flush(); to.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

जैसा कि यह देखा गया है, मैं स्ट्रीम को फ्लश और बंद करता हूं, लेकिन जब मैं हटाने की कोशिश करता हूं, file.delete() झूठी रिटर्न देता है।

मैंने फ़ाइल को मौजूद होने के लिए हटाने से पहले जांच की और फ़ाइल। file.exists() , file.canRead() , file.canWrite() , file.canExecute() सभी रिटर्न सत्य हैं। इन तरीकों को कॉल करने के बाद, मैं file.delete() कोशिश करता file.delete() और झूठी वापसी करता हूं।

क्या मैंने कुछ भी गलत किया है?

Solutions Collecting From Web of "file.delete () भले ही file.exists (), file.canRead (), file.canWrite (), file.canExecute () सभी रिटर्न सच भी गलत रिटर्न"

जावा में एक और बग मैं शायद ही कभी उन्हें खोजता हूं, मेरे 10 साल के कैरियर में केवल मेरा दूसरा यह मेरा समाधान है, जैसा कि दूसरों ने उल्लेख किया है मेरे पास कम उपयोग System.gc() लेकिन यहाँ, मेरे मामले में, यह बिल्कुल महत्वपूर्ण है अजीब? हाँ!

 finally { try { in.close(); in = null; out.flush(); out.close(); out = null; System.gc(); } catch (IOException e) { logger.error(e.getMessage()); e.printStackTrace(); } } 

यह बहुत ही अजीब चाल थी जो काम करता था। बात यह है कि जब मैंने पहले फाइल की सामग्री पढ़ी है, तो मैंने BufferedReader उपयोग किया था। पढ़ने के बाद, मैं बफर बंद कर दिया

इस बीच मैंने स्विच किया और अब मैं FileInputStream का उपयोग करके सामग्री पढ़ रहा हूं। पढ़ने के बाद भी मैं धारा को बंद कर देता हूं और अब यह काम कर रहा है।

समस्या यह है कि मेरे पास इसके लिए स्पष्टीकरण नहीं है।

मैं BufferedReader और FileOutputStream को असंगत होने के बारे में नहीं जानता।

मैंने इस साधारण चीज़ की कोशिश की और ऐसा लगता है कि काम करना

 file.setWritable(true); file.delete(); 

इससे मेरा काम बनता है।

यदि यह काम नहीं करता है तो अपने जावा एप्लिकेशन को sudo के साथ चलाने की कोशिश करें, अगर लिनक्स पर और व्यवस्थापक के रूप में जब विंडोज़ पर। सिर्फ यह सुनिश्चित करने के लिए कि जावा में फ़ाइल गुणों को बदलने का अधिकार है

किसी भी फ़ाइल को हटाने / नाम बदलने का प्रयास करने से पहले, आपको यह सुनिश्चित करना होगा कि सभी पाठकों या लेखकों (पूर्व: BufferedReader / InputStreamReader / BufferedWriter ) ठीक से बंद हैं।

जब आप अपने डेटा को / फ़ाइल से पढ़ने / लिखने की कोशिश करते हैं, तो फ़ाइल को प्रक्रिया द्वारा आयोजित किया जाता है और प्रोग्राम निष्पादन पूर्ण होने तक रिलीज नहीं किया जाता है। यदि प्रोग्राम समाप्त होने से पहले आप हटाना / नाम बदलें संचालन करना चाहते हैं, तो आपको java.io.* close() java.io.* क्लासेस के साथ आने वाली close() विधि का उपयोग करना होगा।

जैसा जॉन स्कीट ने टिप्पणी की थी, आपको अंत में {…} ब्लॉक में अपनी फ़ाइल बंद करनी चाहिए, यह सुनिश्चित करने के लिए कि यह हमेशा बंद रहता है और, e.printStackTrace के साथ अपवादों को निगलने के बजाय, बस विधि हस्ताक्षर को अपवाद को पकड़ और जोड़ना नहीं है। यदि आप किसी भी कारण से नहीं कर सकते हैं, तो कम से कम ऐसा करें:

 catch(IOException ex) { throw new RuntimeException("Error processing file XYZ", ex); } 

अब, प्रश्न संख्या # 2:

यदि आप ऐसा करते हैं तो क्या होगा:

 ... to.close(); System.out.println("Please delete the file and press <enter> afterwards!"); System.in.read(); ... 

क्या आप फ़ाइल को हटाने में सक्षम होंगे?

साथ ही, जब वे बंद हो जाते हैं तब फ़ाइलों को फ़्लेचर किया जाता है। मैं IOUtils.closeQuietly (…) का उपयोग करता हूं, इसलिए मैं यह सुनिश्चित करने के लिए फ्लश विधि का उपयोग करता हूं कि इससे पहले कि मैं इसे बंद करने का प्रयास करता हूं (IOUtils.closeQuietly अपवाद नहीं फेंकता)। कुछ इस तरह:

 ... try { ... to.flush(); } catch(IOException ex) { throw new CannotProcessFileException("whatever", ex); } finally { IOUtils.closeQuietly(to); } 

इसलिए मुझे पता है कि फाइल की सामग्री वहां मौजूद है। जैसा कि यह आमतौर पर मेरे लिए मायने रखता है कि फाइल की सामग्री लिखी गई है और नहीं, अगर फाइल बंद हो गई हो या नहीं, तो वास्तव में कोई फर्क नहीं पड़ता अगर फाइल बंद हो गई या नहीं। आपके मामले में, जैसा कि यह मायने रखता है, मैं फाइल को खुद बंद करने और किसी भी अपवाद का इलाज करने की सिफारिश करता हूं।

कोई कारण नहीं है कि आपको इस फ़ाइल को हटाने में सक्षम नहीं होना चाहिए। मुझे यह देखने की ज़रूरत है कि इस फाइल पर कौन पकड़ है यूनिक्स / लिनक्स में, आप lsof उपयोगिता का उपयोग करके जांच सकते हैं कि किस प्रक्रिया में फाइल पर लॉक है। खिड़कियों में, आप प्रोसेस एक्सप्लोरर का उपयोग कर सकते हैं।

एलएसओफ़ ​​के लिए, यह कह के रूप में सरल है:

 lsof /path/and/name/of/the/file 

प्रोसेस एक्सप्लोरर के लिए आप ढूंढें मेनू का उपयोग कर सकते हैं और फ़ाइल नाम दर्ज कर सकते हैं जिससे आप को संभाल कर सकते हैं जो आपको फाइल लॉक करने की प्रक्रिया में बताएगा।

यहाँ कुछ कोड है जो मुझे लगता है कि आपको करने की आवश्यकता है:

 FileOutputStream to; try { String file = "/tmp/will_delete.txt"; to = new FileOutputStream(file ); to.write(new String("blah blah").getBytes()); to.flush(); to.close(); File f = new File(file); System.out.print(f.delete()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

यह ओएस एक्स पर ठीक काम करता है। मैंने इसे विंडोज़ पर परीक्षण नहीं किया है लेकिन मुझे संदेह है कि इसे विंडोज पर भी काम करना चाहिए। मैं भी Windows wrt फ़ाइल हैंडलिंग पर कुछ अप्रत्याशित व्यवहार देखने को स्वीकार करेगा।

यदि आप एक्लिप्स आईडीई में काम कर रहे हैं, तो इसका मतलब यह हो सकता है कि आपने फ़ाइल के पिछले लॉन्च में फाइल को बंद नहीं किया है। जब मुझे एक फाइल को हटाने की कोशिश में एक ही त्रुटि संदेश था, तो यही कारण था। ऐसा लगता है, ग्रहण आईडीई किसी भी आवेदन के समापन के बाद सभी फाइलों को बंद नहीं करता है।

उम्मीद है कि इससे मदद मिलेगी मैं इसी तरह की समस्या में आया हूं जहां मेरे जावा कोड ने अन्य फ़ोल्डर में सामग्री की एक कॉपी बना दी, जहां मैं अपनी फ़ाइल को नहीं हटा सके। विस्तृत गोगलिंग के बाद, मैंने स्पष्ट रूप से हर एक फ़ाइल ऑपरेशन से संबंधित चर को घोषित किया और प्रत्येक फाइल ऑपरेशन ऑब्जेक्ट के करीबी () विधि को बुलाया, और उन्हें नल में सेट किया। फिर, एक समारोह है जिसे System.gc () कहा जाता है, जो फाइल आई / ओ मैपिंग को साफ कर देगा (मुझे यकीन नहीं है, मैं सिर्फ वेब साइट पर दिया गया है)।

यहां मेरा उदाहरण कोड है:

 public void start() { File f = new File(this.archivePath + "\\" + this.currentFile.getName()); this.Copy(this.currentFile, f); if(!this.currentFile.canWrite()){ System.out.println("Write protected file " + this.currentFile.getAbsolutePath()); return; } boolean ok = this.currentFile.delete(); if(ok == false){ System.out.println("Failed to remove " + this.currentFile.getAbsolutePath()); return; } } private void Copy(File source, File dest) throws IOException { FileInputStream fin; FileOutputStream fout; FileChannel cin = null, cout = null; try { fin = new FileInputStream(source); cin = fin.getChannel(); fout = new FileOutputStream(dest); cout = fout.getChannel(); long size = cin.size(); MappedByteBuffer buf = cin.map(FileChannel.MapMode.READ_ONLY, 0, size); cout.write(buf); buf.clear(); buf = null; cin.close(); cin = null; fin.close(); fin = null; cout.close(); cout = null; fout.close(); fout = null; System.gc(); } catch (Exception e){ this.message = e.getMessage(); e.printStackTrace(); } } 

जवाब है कि जब आप फ़ाइल लोड करते हैं, तो आपको "बंद" विधि को कोड के किसी भी रेखा में लागू करने की आवश्यकता होती है, मेरे लिए काम करती है

एक बार रूबी में एक समस्या थी, जहां खिड़कियों में फाइलें "एफएसआईएनसी" की आवश्यकता होती थी, वास्तव में इसे लिखने और इसे बंद करने के बाद फ़ाइल को फिर से पढ़ना और पुन: पढ़ने में सक्षम होना था। हो सकता है कि यह एक समान अभिव्यक्ति है (और यदि हां, तो मुझे एक विंडो बग लगता है, वास्तव में)।

यहां सूचीबद्ध किसी भी समाधान ने मेरी स्थिति में काम किया। मेरा समाधान एक समय की लूप का उपयोग करना था, सुरक्षा के लिए 5 सेकंड (कॉन्फ़िगर करने योग्य) सीमा के साथ फाइल को हटाने का प्रयास करना

 File f = new File("/path/to/file"); int limit = 20; //Only try for 5 seconds, for safety while(!f.delete() && limit > 0){ synchronized(this){ try { this.wait(250); //Wait for 250 milliseconds } catch (InterruptedException e) { e.printStackTrace(); } } limit--; } 

उपर्युक्त लूप का उपयोग बिना मैन्युअल कचरा संग्रहण को एकत्रित करने या नल के लिए आदि की स्थापना के बिना किया।

समस्या यह हो सकती है कि फ़ाइल अभी भी एक प्रोग्राम द्वारा खोले और लॉक के रूप में देखी जाती है; या हो सकता है कि यह आपके प्रोग्राम से एक घटक है जिसमें इसे खोला गया था, इसलिए आपको यह सुनिश्चित करना होगा कि आप उस समस्या को हल करने के लिए dispose() विधि का उपयोग करें। JFrame frame; .... frame.dispose(); JFrame frame; .... frame.dispose();

आपको सभी नदियों को बंद करना होगा या संसाधन के साथ-प्रयास का उपयोग करना होगा

 static public String head(File file) throws FileNotFoundException, UnsupportedEncodingException, IOException { final String readLine; try (FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); LineNumberReader lnr = new LineNumberReader(isr)) { readLine = lnr.readLine(); } return readLine; } 

अगर file.delete () झूठे भेज रहा है तो ज्यादातर मामलों में आपका बुफ़रफ़्रेंडर हैंडल बंद नहीं किया जाएगा। बस करीब है और यह सामान्य रूप से मेरे लिए काम करने लगता है

मेरे पास विंडोज पर एक ही समस्या थी मैं फ़ाइल को स्कला लाइन में लाइन के साथ पढ़ने में करता था

 Source.fromFile(path).getLines() 

अब मैं इसे पूरी तरह से पढ़ता हूं

 import org.apache.commons.io.FileUtils._ // encoding is null for platform default val content=readFileToString(new File(path),null.asInstanceOf[String]) 

जो फ़ाइल पढ़ने के बाद ठीक से बंद कर देता है और अब

 new File(path).delete 

काम करता है।

ग्रहण / नेटबींस के लिए

अपना आईडीई पुनः आरंभ करें और अपना कोड फिर से चलाएं यह एक घंटे के लंबे संघर्ष के बाद मेरे लिए केवल चाल कार्य है I

यहां मेरा कोड है:

 File file = new File("file-path"); if(file.exists()){ if(file.delete()){ System.out.println("Delete"); } else{ System.out.println("not delete"); } } 

आउटपुट:

हटाना