【问题标题】:cordova-ionic ngCordova ios or iPhone file read error code 5 ENCODING_ERRcordova-ionic ngCordova ios 或 iPhone 文件读取错误代码 5 ENCODING_ERR
【发布时间】:2015-01-07 15:40:16
【问题描述】:

我正在使用 cordova-ionic 框架来构建应用程序。我是 iOS 或 iPhone 的新手 在我的要求中,我必须读取应用程序中的文件。我正在阅读 android 应用程序中的文件,但相同的代码显示错误(代码:5)。

我正在关注代码类型:

在安卓中:

$cordovaFile.writeFile(( 'user.json', data, {'append':false} )).then(function(result) {
  alert('file created.');
    alert(JSON.stringify(result));
}, function(err) {
    // An error occured. Show a message to the user
    alert('file writed');
    alert(JSON.stringify(err));
});

我可以创建文件、写入、读取数据和删除文件,但在 ios 手机中我无法使用相同的代码创建文件。

在 iPhone 中:

var data = {"user":{"name":"errer","email":"sdsdff@gmail.com","username":"sdfsdfsd"}};

$cordovaFile.writeFile(( 'user.json', data, {'append':false} )).then(function(result) {
    // Success!
    alert('file created.');
    alert(JSON.stringify(result));
}, function(err) {
    // An error occured. Show a message to the user
    alert('file writed');
    alert(JSON.stringify(err));
});

我只是改变我的目录是cordova.file.cacheDirecotry/cordova.file.applicationDirectory

$cordovaFile.createFile(( cordova.file.cacheDirecotry+'user.json', true )).then(function(result) {
    // Success!
    alert('file created.');
    alert(JSON.stringify(result));
}, function(err) {
    // An error occured. Show a message to the user
    alert('file writed');
    alert(JSON.stringify(err));
});

一直得到错误,如代码:12 或代码:5

请帮我解决这个问题或给我一个想法来获取应用程序文件路径

【问题讨论】:

    标签: android ios iphone cordova ionic-framework


    【解决方案1】:

    我有一些进步。

    首先,我提醒我的 cordova.file.dataDirectory 或 cordova.file.documentsDirectory。 他们是

    file:///var/mobile/...../Library/NoCloud 
    

    file:///var/mobile/..../Documents
    

    然后我创建一个没有前缀的文件并成功。参考这个https://github.com/driftyco/ng-cordova/issues/362

    并且成功信息显示文件的native url保存在

    file:///var/mobile/...../Library/files
    

    这很奇怪。顺便说一句,我添加了

    <preference name="iosPersistentFileLocation" value="Library" />
    

    根据https://github.com/apache/cordova-plugin-file/blob/master/doc/index.md#ios-persistent-storage-location

    所有测试都是在IOS上运行的,我还没有在Android上测试过。

    更新

    以下所有代码都为我工作并给出成功响应

    $cordovaFile.checkFile('/test.data')
    
    $cordovaFile.createFile('test.data',false)
    
    $cordovaFile.checkDir('/')
    

    希望这可以解决您的问题。

    【讨论】:

    • 我不完全明白你在做什么。所以你需要在开始时删除文件///?
    • 诀窍是停止指定目录,例如cordova.file.dataDirectory,只指定文件名
    【解决方案2】:

    /*
    Here is what I am using for my Android and IOS apps
    Keep attention to a couple of things:
    -	Android and IOS have other directorynames for files
    -	Android devices have different root (myFSRootDirectory1 = Samsung Tab 3, msFSRootDirectory2 = Samsung SII)
    -	$cordovaFile functions prefixes all pathnames with root
    $cordovaFileTransfer functions needs absolute pathnames
    
    Here I create the prefixes for File functions and FileTransfer functions for Android and IOS
    */
    
    // The $ionicPlatform and ionic.Platorm are from Ionic framework
    //  
    
    $ionicPlatform.ready(function() {
    	if (ionic.Platform.isAndroid()) {
    // If running on Android
    console.log('cordova.file.externalDataDirectory: ' + cordova.file.externalDataDirectory);
    //
    // I use cordova.file.externalDataDirectory because this url is for Android devices
    // If you remove the app from the device these url are cleared too on the device. So keep it clean.
    // Remove the root from cordova.file.externalDataDirectory
    // 
    			myFsRootDirectory1 = 'file:///storage/emulated/0/'; // path for tablet
    			myFsRootDirectory2 = 'file:///storage/sdcard0/'; // path for phone
    			fileTransferDir = cordova.file.externalDataDirectory;
    			if (fileTransferDir.indexOf(myFsRootDirectory1) === 0) {
    				fileDir = fileTransferDir.replace(myFsRootDirectory1, '');
    			}
    			if (fileTransferDir.indexOf(myFsRootDirectory2) === 0) {
    				fileDir = fileTransferDir.replace(myFsRootDirectory2, '');
    			}
    console.log('Android FILETRANSFERDIR: ' + fileTransferDir);
    console.log('Android FILEDIR: ' + fileDir);
    		}
    		if (ionic.Platform.isIOS()) {
    // if running on IOS
    console.log('cordova.file.documentsDirectory: ' + cordova.file.documentsDirectory);
    // I use cordova.file.documentsDirectory because this url is for IOS (NOT backed on iCloud) devices
    			fileTransferDir = cordova.file.documentsDirectory;
    			fileDir = '';
    console.log('IOS FILETRANSFERDIR: ' + fileTransferDir);
    console.log('IOS FILEDIR: ' + fileDir);
    		}
    
    	if (ionic.Platform.isAndroid() || ionic.Platform.isIOS()) {
    //
    // Just functions from the list below one by one ( or chain them)
    //
    	}
    });
    
    
    
    // Download file from 'http://www.yourdomain.com/test.jpg' to test/one/test.jpg on device Filesystem
    var hostPath = 'http://www.yourdomain.com/test.jpg';
    var clientPath = fileTransferDir + 'test/one/test.jpg';
    var fileTransferOptions = {};
    
    $cordovaFile.downloadFile(hostPath, clientPath, true, fileTransferOptions).then (function() {
    });
    // Create dir test
    $cordovaFile.createDir(fileDir + 'test/').then( function(dirEntry) {
    });
    // Create dir aganin in dir test
    $cordovaFile.createDir(fileDir + 'test/one/').then( function(dirEntry) {
    });
    // Create empty file test.txt in test/again/
    $cordovaFile.createFile(fileDir + 'test/one/test.txt', true).then( function(fileEntry) {
    });
    // List of files in test/again
    $cordovaFile.listDir(fileDir + 'test/one/').then( function(entries) {
    console.log('list dir: ', entries);
    });
    // Write some text into file 
    $cordovaFile.writeFile(fileDir + 'test/one/test.txt', 'Some text te test filewrite', '').then( function(result) {
    });
    // Read text written in file
    $cordovaFile.readAsText(fileDir + 'test/one/test.txt').then( function(result) {
    console.log('readAsText: ', result);
    });

    【讨论】:

    • 我在 $ionicPlatform.ready(function() {}); 内运行 $cordovaFile.getFreeDiskSpace().then(function() {success}, function(error) {});。上面写着Uncaught ReferenceError: cordova is not defined 有什么想法吗?
    • 对不起,没有在 www/ 文件夹中添加cordova.js,但是应用程序仍然会运行,但会显示 ReferenceError。
    【解决方案3】:

    也许是因为错字?你有cordova.file.cacheDirecotry。不应该是:cordova.file.cacheDirectory 吗?

    【讨论】:

      【解决方案4】:

      请参阅原始文档:- https://github.com/apache/cordova-plugin-file/blob/master/doc/index.md#ios-file-system-layout

      iOS 有一些目录是只读的。尝试改变你的路径。

      如果它不适合你,请告诉我。

      【讨论】:

      • 这被标记为正确答案,但与错误代码 5 无关,即ENCODING_ERR我正在使用dataDirectory,它是 r/w 并且仍在获取代码:5
      • 答案被标记为正确,因为它指出了文档。其中说:github.com/apache/cordova-plugin-file/blob/master/doc/… 很多关于错误代码 5
      • 此外,问题已说明错误 12 或 5 而不仅仅是 5。一般问题有一个一般答案:)
      • @divyenduz 文档引用了该错误,可以说文档有“很多关于错误代码 5”
      • 我明白,我遇到了同样的错误,它适用于问题海报。请告诉我如何编辑答案以使其更好?
      猜你喜欢
      • 2018-02-05
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      相关资源
      最近更新 更多