android file.renameTo更改子目录名称

时间:2014-04-25 21:30:09

标签: java android filesystems ext4

我在android中重命名文件夹然后再次读取文件时遇到了一个非常奇怪的问题。我永远无法在任何或我们的本地测试设备上重现这一点,我知道没有人有个好主意。

未决问题:

  • 使用renameTo()重命名文件时,更改子文件夹名称有什么用?
  • 文件系统有哪些限制,加上我在这里缺少的Char编码? (我也找不到任何我可以为File指定字符编码的内容)

问题

我有一个名为name/的文件夹,其内容是其他文件和文件夹。 name/可以是用户生成的文件夹名称。我们的工作涉及多种语言,包括阿拉伯语,中文等。 多个设备上都会出现此问题。

我正在将所有内容从name/移至.old/name/。我使用的代码是

File[] dirs = mRootDir.listFiles(FileFilters.FilterDotFiles); // name/ will be in that list
mOldTmp.mkdir(); //create the .old folder
for(File f : dirs) { //move all dirs into .old
    File oldSubDir = new File(mOldTmp, f.getName());
    boolean renameSuccess = f.renameTo(oldSubDir); //true, as I otherwise would never run into the problem later in code.
}

文件全部移动。似乎文件夹名称在某些情况下搞砸了。当我稍后列出.old文件夹中的文件时:

for(File dir : mOldTmp.listFiles(FileFilters.FilterFiles)) {
    for(File f : dir.listFiles(FileFilters.FilterDotFiles)) {
    }
}

我获取具有以下路径的文件。这个特别的人是阿拉伯语用户。在尝试通过创建新new InputSteam(new FileInputStream(f))来阅读文件时,我得到IOException

.old/ÃÂçÃÂÃÂÃÂÃÂÃÂìÃÂÃÂÃÂï ÃÂçÃÂÃÂÃÂãÃÂóÃÂçÃÂóÃÂÃÂ/1392446611086.mzvg2bn56i1rsqe4ko1_1280.jpeg
open failed: ENOENT (No such file or directory)

用户抱怨文件不再可见。这是有道理的,因为我无法读取它们,但这也意味着该文件在重命名开始之前就已可用。

尝试重现它

测试1:当我adb push一个带有阿拉伯字符的name/文件夹并运行我的代码时,renameTo()文件操作和一切都按预期工作。

测试2:我可以在计算机上创建一个名为name/的{​​{1}}文件夹。这在OSX 10.8.5上运行良好。当我尝试使用ÃÂçÃÂÃÂÃÂÃÂÃÂìÃÂÃÂÃÂï ÃÂçÃÂÃÂÃÂãÃÂóÃÂçÃÂóÃÂÃÂ时,我得到相同的错误

adb push

显示此目录的内容不一致:

$ adb push . /mnt/sdcard/debug
push: ./.old/ÃÂçÃÂÃÂÃÂÃÂÃÂìÃÂÃÂÃÂï ÃÂçÃÂÃÂÃÂãÃÂóÃÂçÃÂóÃÂÃÂ/.thumbs/1398208681403.2013-12-24 15.11.43.jpg -> /mnt/sdcard/debug/.old/ÃÂçÃÂÃÂÃÂÃÂÃÂìÃÂÃÂÃÂï ÃÂçÃÂÃÂÃÂãÃÂóÃÂçÃÂóÃÂÃÂ/.thumbs/1398208681403.2013-12-24 15.11.43.jpg
failed to copy './.old/ÃÂçÃÂÃÂÃÂÃÂÃÂìÃÂÃÂÃÂï ÃÂçÃÂÃÂÃÂãÃÂóÃÂçÃÂóÃÂÃÂ/.thumbs/1398208681403.2013-12-24 15.11.43.jpg' to '/mnt/sdcard/debug/.old/ÃÂçÃÂÃÂÃÂÃÂÃÂìÃÂÃÂÃÂï ÃÂçÃÂÃÂÃÂãÃÂóÃÂçÃÂóÃÂÃÂ/.thumbs/1398208681403.2013-12-24 15.11.43.jpg': No such file or directory

$ ls -l .old/
total 0
drwxr-xr-x  24 philipp  staff   816B Apr 25 11:54 Ã?Â?Ã?§Ã?Â?Ã?Â?Ã?Â?Ã?Â?Ã?Â?Ã?¬Ã?Â?Ã?Â?Ã?Â?Ã?¯ Ã?Â?Ã?§Ã?Â?Ã?Â?Ã?Â?Ã?£Ã?Â?Ã?³Ã?Â?Ã?§Ã?Â?Ã?³Ã?Â?Ã?Â

下次运行

$ ls -l .old/ÃÂçÃÂÃÂÃÂÃÂÃÂìÃÂÃÂÃÂï\ ÃÂçÃÂÃÂÃÂãÃÂóÃÂçÃÂóÃÂÃÂ/
total 69880
-rw-r--r--  1 philipp  staff   571K Apr 22 17:13 1398208669809.2014-02-08 14.26.50.jpg
-rw-r--r--  1 philipp  staff   2.2M Apr 22 17:13 1398208670282.2014-02-08 14.22.11.jpg
-rw-r--r--  1 philipp  staff   2.1M Apr 22 17:13 1398208670990.2014-02-08 14.21.11.jpg
... more files

当我$ ls -l .old/ÃÂçÃÂÃÂÃÂÃÂÃÂÃa¬ÃÂÃÂÃÂï\ ÃÂçÃÂÃÂÃÂãÃÂóÃÂçÃÂóÃÂÃÂ/ ls: .old/ÃÂçÃÂÃÂÃÂÃÂÃÂÃa¬ÃÂÃÂÃÂï ÃÂçÃÂÃÂÃÂãÃÂóÃÂçÃÂóÃÂÃÂ/: File name too long 进入cd时,我总是可以列出整个内容。

0 个答案:

没有答案