You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cordova.apache.org by "Alan Neveu (JIRA)" <ji...@apache.org> on 2012/12/18 14:52:12 UTC
[jira] [Created] (CB-2084) CordovaWP7 FileEntry.write Intermittent
Errors
Alan Neveu created CB-2084:
------------------------------
Summary: CordovaWP7 FileEntry.write Intermittent Errors
Key: CB-2084
URL: https://issues.apache.org/jira/browse/CB-2084
Project: Apache Cordova
Issue Type: Bug
Components: WP7, WP8
Affects Versions: 2.3.0
Environment: Windows Phone 7, Windows Phone 8
Reporter: Alan Neveu
Assignee: Jesse MacFadyen
I have found problems due to strange behavior with writing new files to the device. I found that the File.cs function called:
public void write(string options)
is intermittently losing the filePath value that comes in via options. This happens a lot when the file is being created and does not exist. It does not happen 100% of the time, however. What seems to be happening is that the call to getMetaData while getting a FileEntry object fails because the file does not exist and when the FileEntry is then used to write a new file to the device the filePath is null. My application needs to downloads maybe 30 files from a web service and write them all to disk. While I am looping through the files I downloaded and attempting to write them to disk, maybe 2 or 3 out of 30 will experience this problem.
I wrote a simple function for writing files called write2, and it lives in my File.cs file. This is what it looks like:
public void write2(string options)
{
string[] optStrings = JSON.JsonHelper.Deserialize<string[]>(options);
string filename = optStrings[0];
string data = optStrings[1];
try
{
using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication())
{
bool booExists = isoFile.FileExists(filename);
if (booExists)
{
isoFile.DeleteFile(filename);
}
IsolatedStorageFileStream myNewIsoFS = isoFile.CreateFile(filename);
byte[] bytData = System.Text.Encoding.UTF8.GetBytes(data);
myNewIsoFS.Write(bytData, 0, bytData.Length);
myNewIsoFS.Close();
}
}
catch (Exception ex)
{
string whaa = ex.Message;
}
}
It’s really lame and limited, I know, but it works every time. I also had to modify cordova-2.3.0.js to shim my function in there. All I did was copy the FileWriter.prototype.write function and name mine write2, and I also made mine so that it accepts two parameters - the first being the filename and the second being the data. This allows me to pass these arguments to my write2 function in File.cs, and from there I definitely have the filename every time, which then allows me to simply write the file to disk. I spent many hours trying to figure out how/why the normal write call is sometimes losing the filename and filePath, but I just can’t figure it out. Here is what my FileWriter.prototype.write2 javascript function looks like:
FileWriter.prototype.write2 = function (targetfilename, text) {
// Throw an exception if we are already writing a file
console.log("targetfilename=" + targetfilename);
if (this.readyState === FileWriter.WRITING) {
throw new FileError(FileError.INVALID_STATE_ERR);
}
// WRITING state
this.readyState = FileWriter.WRITING;
var me = this;
// If onwritestart callback
if (typeof me.onwritestart === "function") {
me.onwritestart(new ProgressEvent("writestart", { "target": me }));
}
// Write file
exec(
// Success callback
function (r) {
// If DONE (cancelled), then don't do anything
if (me.readyState === FileWriter.DONE) {
return;
}
// position always increases by bytes written because file would be extended
me.position += r;
// The length of the file is now where we are done writing.
me.length = me.position;
// DONE state
me.readyState = FileWriter.DONE;
// If onwrite callback
if (typeof me.onwrite === "function") {
me.onwrite(new ProgressEvent("write", { "target": me }));
}
// If onwriteend callback
if (typeof me.onwriteend === "function") {
me.onwriteend(new ProgressEvent("writeend", { "target": me }));
}
},
// Error callback
function (e) {
// If DONE (cancelled), then don't do anything
if (me.readyState === FileWriter.DONE) {
return;
}
// DONE state
me.readyState = FileWriter.DONE;
// Save error
me.error = new FileError(e);
// If onerror callback
if (typeof me.onerror === "function") {
me.onerror(new ProgressEvent("error", { "target": me }));
}
// If onwriteend callback
if (typeof me.onwriteend === "function") {
me.onwriteend(new ProgressEvent("writeend", { "target": me }));
}
}, "File", "write2", [targetfilename, text]);
};
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira