1、開發中發現,當兩個文件名只有大小寫的區別,其他都一樣的情況,android中會默認是同一個文件。
比如,你在同一個文件夾下有一個文件 aa.txt 重新創建一個文件命名為AA.txt android系統會認為這倆是同一個文件,從而出現覆蓋的問題。
經測試發現,windows、Mac osx 系統也是這樣的。
2、項目中遇到的問題是。創建文檔時防止文件重名導致的覆蓋問題。使用 file.exist()方法來判斷文件是否存在,經測試發現:
存儲路徑時sd卡時,該方法不區分大小寫,但是路徑在data/目錄下時,改方法區分大小寫。 但是只是該方法區分大小寫,實際存入data/目錄下的文件名系統還是不區分大小寫,所以當文件路徑是data/時,就不能使用此方法判斷文件是否存在。
如果你有兩個文件,/sdcard/file (在 SD卡)和 /data/file (在內部文件系統), 你會得到以下結果: new File("/sdcard/file").exists(); // true new File("/sdcard/FILE").exists(); // true, /sdcard是一個不區分大小寫的文件系統 new File("/data/file").exists(); // true new File("/data/FILE").exists(); // false, /數據是區分大小寫的文件系統
//從數據庫讀出該文件夾下的所有文件,然后把名稱轉換成小寫存入集合,把用戶數據的文件名字也轉為小寫,然后進行判斷重名。 mModel.loadFiles(FixedFolderHelper.DOCUMENTFOLDER, new CallBack<ArrayList<Files>>() { @Override public void onSuccess(ArrayList<Files> datas) { ArrayList<String> names = new ArrayList<>(); for (Files file : datas) { String fileName = file.getFileName(); names.add(fileName.toLowerCase()); } String newName_1 = newName + Constant.MYDOCUSUFFIX; if (!names.contains(newName_1.toLowerCase())) { String filePath = FixedFolderHelper.DOCUMENTFOLDER + "/" + newName_1; saveFile(filePath, inputText); } else { mView.showToast("文件名已存在"); } //當存儲路徑為sd卡時使用此方法比較簡潔,但如果存儲路徑是data/目錄下時,需要使用上面的方法判斷。 //String newName_1 = newName + Constant.MYDOCUSUFFIX; // String filePath = FixedFolderHelper.DOCUMENTFOLDER + "/" + newName_1; // File file = new File(filePath); // if (!file.exists()) {//存儲路徑是在sd卡時,可以使用此方法。 // saveFile(filePath, inputText); // } else { // mView.showToast("文件名已存在"); // // } } @Override public void onFailed(String errorDetail) { } });
