【问题标题】:Result of .renameTo() is ignored.renameTo() 的结果被忽略
【发布时间】:2015-09-09 14:46:55
【问题描述】:

我正在尝试通过 FTP 上传文件,但在上传之前必须将其重命名为 2 个 editText 的输入。为此,我使用以下代码:

public FTPClient client = new FTPClient();

    public void upload_klik (View view) {
        EditText week_text = (EditText) findViewById(R.id.week_edit);
        EditText pagina_text = (EditText) findViewById(R.id.pagina_edit);
        String w_val = week_text.getText().toString();
        String p_val = pagina_text.getText().toString();
        upload_task up = new upload_task();
        up.execute(w_val, p_val);
    }

    protected class upload_task extends AsyncTask<String, Object, String> {

        @Override
        protected String doInBackground(String... params) {

            String w = params[0];
            String p = params[1];

            Intent intent = getIntent();
            Bundle bundle = intent.getExtras();
            String ret = "Done!";
            if(!bundle.isEmpty()) {
                String afdeling_url = bundle.getString("afdeling_url", "DKW/");
                String afdeling_preFix = bundle.getString("afdeling_preFix", "dkw");
                String locatie_url = bundle.getString("locatie_url", "/delf_wend/");

                String new_fileName = afdeling_preFix +"_" + "w" + w + "_" + "p" + p + ".jpg";

                System.out.println(new_fileName);

                File f = new File(foto_path);
                File sdcard = Environment.getExternalStorageDirectory();
                File to = new File(sdcard, new_fileName);
                f.renameTo(to);

                if(f != null) {

                    try{
                        client.setPassive(true);
                        client.setAutoNoopTimeout(30000);
                        client.connect(FTP_HOST, 21);
                        client.login(FTP_USER, FTP_PASS);
                        client.setType(FTPClient.TYPE_BINARY);
                        System.out.println(locatie_url + afdeling_url);
                        client.changeDirectory(locatie_url + afdeling_url);
                        client.upload(to);

                        restart();

                    }
                    catch (Exception e){
                        e.printStackTrace();
                        try {
                            client.disconnect(true);
                        }
                        catch (Exception e2) {
                            e2.printStackTrace();
                        }
                    }
                }

            }
            return ret;
        }
    }

但是当我尝试上传它时,Logcat 给了我这个:

09-09 16:33:17.794  23674-25966/nl.knapper_development.jrw_uploader I/System.out﹕ slag_w11_p222.jpg
09-09 16:33:17.994  23674-25966/nl.knapper_development.jrw_uploader I/System.out﹕ /delf_wend/SLAG/
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ java.io.FileNotFoundException: /slag_w11_p222.jpg
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ at it.sauronsoftware.ftp4j.FTPClient.upload(FTPClient.java:2577)
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ at it.sauronsoftware.ftp4j.FTPClient.upload(FTPClient.java:2457)
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ at nl.knapper_development.jrw_uploader.upload$upload_task.doInBackground(upload.java:154)
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ at nl.knapper_development.jrw_uploader.upload$upload_task.doInBackground(upload.java:119)
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:288)
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-09 16:33:18.024  23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

我把问题缩小到函数f.renameTo(new_fileName),它说调用这个方法的结果被忽略了。但是为什么会被忽略呢?有没有办法解决这个问题?

提前谢谢你:)

【问题讨论】:

  • 它被忽略了,因为你没有在做boolean result = f.renameTo(to); 但这不会影响你代码的功能。如果您的服务器正在接收文件,我不会担心警告。
  • @EdsonMenegatti 查看logcat日志,找不到要上传的文件:/ 09-09 16:33:18.024 23674-25966/nl.knapper_development.jrw_uploader W/System.err﹕ java.io.FileNotFoundException: /slag_w11_p222.jpg

标签: android android-asynctask ftp4j


【解决方案1】:

这个错误很简单,它都记录在案了:

https://developer.android.com/reference/java/io/File.html#renameTo(java.io.File)

很多失败都是可能的。一些更可能的失败包括:

  • 需要对包含源路径和目标路径的目录具有写权限。
  • 两条路径的所有父级都需要搜索权限。
  • 两条路径都在同一个安装点上。在 Android 上,应用程序在尝试在内部存储和 SD 卡之间进行复制时最有可能遇到此限制。

https://developer.android.com/reference/java/io/FileNotFoundException.html

找不到程序指定的文件时抛出

我敢打赌,如果您使用代码检查文件是否存在:

if(f.exists()){

您会发现foto_path 不是现有文件,或者您应该检查foto_path 是否也在Environment.getExternalStorageDirectory() 中。

如果它不在同一个挂载点,您必须复制文件(使用新名称)而不是重命名。

【讨论】:

  • 好吧,我明白了,我尝试了一些方法,但我确定我无法从我的 sdcard 中选择文件。它比打印“/storage/extSdcard/....”但是当我从我的下载文件夹中选择一张照片时,它不在我的 Sdcard 上,它显示“/storage/emulated/0/....”这些文件确实上传,那么我做错了什么?你提到了移动文件?
  • 如果一个文件在设备内存中(大多数设备为 16GB 或 32GB)而另一个在 SD 卡上,renameTo() 将失败。这是我从文档中复制的答案的第三个要点。在以下 StackOverflow 答案中,您可以看到如何复制文件。这与您的方法不同,它会物理地将文件的每个字节逐个移动到目标文件。 stackoverflow.com/a/29717446/906362 。您的方法实际上只是重命名文件。复制是一个慢得多的过程,但它可以跨不同的挂载点完成。
【解决方案2】:

RenameTo 重命名实际文件,它不会更改 File 对象。如果你调用 .exists() 你会发现新文件存在而旧文件不存在。

这是因为 File 类代表抽象路径而不是文件系统上的实际文件。这个想法是 File.renameTo 为给定路径的文件系统条目提供一个新名称;它不会改变路径本身。

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多