2013-10-17 2 views
13

के साथ एक फ़ाइल को ओवरराइट करें मैं अपने वेबपैड की स्थिति को बचाने के लिए HTML5 FileWriter API का उपयोग कर रहा हूं। मेरे पास जेएस का थोड़ा सा समय है जो ऐसा करने के लिए समय-समय पर FileWriter.write पर कॉल करता है (इसलिए, समय के साथ, write विधि को कई बार कहा जाता है)। डिफ़ॉल्ट रूप से FileWriter API उन फ़ाइलों को लिखने के लिए 'एपेंड' दृष्टिकोण का उपयोग करता है जो मेरी आवश्यकताओं के अनुरूप नहीं है क्योंकि मैं फ़ाइल सामग्री को ओवरराइट नहीं करना चाहता हूं।एचटीएमएल 5 फाइलवाइटर

मैं पहली बार इस की कोशिश की:

this._writer.seek(0); 
this._writer.write(content); 

यह काम नहीं कर रहा है जब आप एक पाठ फ़ाइल की सामग्री की तुलना में कम लिख रहे हैं। मैं तो इस की कोशिश की:

this._writer.truncate(0); 
this._writer.write(content); 

इस कोड को फ़ाइल स्पष्ट और फिर मेरी नई सामग्री लिखने के लिए माना जाता है, लेकिन मैं निम्नलिखित त्रुटि जब write विधि कहा जाता है हो रही है:

Uncaught InvalidStateError: An operation that depends on state cached in an interface object was made but the state had changed since it was read from disk. 

अजीब बात: जब मैं कोड (ब्रेकपॉइंट के साथ) डीबग करता हूं, तो त्रुटि नहीं होती है, जैसे कि FileWriter.truncate एक असीमित विधि थी ...

मैं यहां किसी भी विचार से फंस गया हूं?

मैं क्रोम 30.0.1599.69

उत्तर

20

यहाँ एक सही कोड इंतजार कर

fileWriter.onwriteend = function() { 
    if (fileWriter.length === 0) { 
     //fileWriter has been reset, write file 
     fileWriter.write(blob); 
    } else { 
     //file has been overwritten with blob 
     //use callback or resolve promise 
    } 
}; 
fileWriter.truncate(0); 
+1

आप विस्तार से बता सकते हैं? "डी" क्या है? – htulipe

+1

@htulipe, यह मेरा jQuery है। परिभाषित ऑब्जेक्ट मैं अधिसूचित होने के लिए बाहरी रूप से उपयोग करता हूं जब दोनों छंटनी और लेखन किया जाता है। लिखने के दौरान आप इसे अवहेलना कर सकते हैं या कोई अन्य कोड जोड़ सकते हैं जिसे आप निष्पादित करना चाहते हैं। –

+0

@htulipe कृपया इसे उत्तर के रूप में चिह्नित करें, अगर यह समस्या हल करता है। –

1

उपयोग कर रहा हूँ का संभावित हल निम्नलिखित कोड है:

this._writer.truncate(0); 
window.setTimeout(function(){ 
    this._writer.write(content); 
}.bind(this),500) 

यह केवल लिखने से पहले 500 मिलीसेकेंड तक प्रतीक्षा करें। महान नहीं है, लेकिन यह काम करता है ...

3

आप काट-छांट कर सकते हैं और फिर दो अलग अलग FileWriter वस्तुओं के साथ लिखने पर 500ms बर्बाद नहीं होगा।

fileEntry.createWriter(function (fileWriter) { 

     fileWriter.truncate(0); 

    }, errorHandler); 

fileEntry.createWriter(function (fileWriter) { 

     var blob = new Blob(["New text"], { type: 'text/plain' }); 

     fileWriter.write(blob); 

    }, errorHandler); 
+0

इसका काम धन्यवाद – Sajan

1

आप हमेशा यह ओवरराइड करना चाहते हैं, तो आप इस विधि

function save(path,data){ 
    window.resolveLocalFileSystemURL(dataDirectory, function(dir){ 
     dir.getFile(path, {create:true}, function(file){ 
      file.createWriter(function(fileWriter){ 
       fileWriter.seek(0); 
       fileWriter.truncate(0); 
       var blob = new Blob([data], {type:'text/plain'}); 
       fileWriter.write(blob); 
      }, function(e){ 
       console.log(e); 
      }); 
     }); 
    }); 
}; 
1

यह सबसे आसान तरीका है कि कैसे मैं अपने Chrome एप्लिकेशन में syncFileSystem के साथ एक फ़ाइल की सामग्री को हटाने के लिए उपयोग करें का उपयोग कर सकते हैं।

दो createWriter, पहले एक तो ट्रंकेटस दूसरा एक कुछ भी नहीं के साथ अधिलेखित कर देता है (यदि आप अपने नए मान के साथ बदल सकते हैं):

file.createWriter((fileWriter)=>fileWriter.truncate(0)); 

file.createWriter((fileWriter)=> { 

    fileWriter.onwriteend = function() { 
    console.log('New Actions!'); 
    }; 

    var blob = new Blob([''], {type: 'text/plain'}); 
    fileWriter.write(blob); 

});