安卓:将文件从一个目录复制到另一个目录

10

我正在复制一个文件(临时音频文件)从源文件夹到目标文件夹作为TT_1A,使用以下代码并利用apache commons库。

代码:

button1_save.setOnClickListener(new OnClickListener() 
    {
        public void onClick(View v) 
        {
            String sourcePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/TT/tt_temp.3gp";
            File source = new File(sourcePath);

            String descPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/TT/tt_1A.3gp";
            File desc = new File(descPath);
            try 
            {
                FileUtils.copyDirectory(source, desc);
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
    }); 

Apache Commons:

http://commons.apache.org/proper/commons-io/download_io.cgi

问题:

我使用了FileUtils函数,将临时文件复制并粘贴到目标文件夹作为TT_1A。但是logcat报告以下错误细节:

10-17 00:41:04.260: E/AndroidRuntime(27450): FATAL EXCEPTION: main
10-17 00:41:04.260: E/AndroidRuntime(27450): java.lang.NoClassDefFoundError: org.apache.commons.io.FileUtils
10-17 00:41:04.260: E/AndroidRuntime(27450):    at com.abc.abc.TT_details_canton$14.onClick(TT_details_canton.java:575)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at android.view.View.performClick(View.java:4223)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at android.view.View$PerformClick.run(View.java:17275)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at android.os.Handler.handleCallback(Handler.java:615)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at android.os.Looper.loop(Looper.java:137)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at android.app.ActivityThread.main(ActivityThread.java:4898)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at java.lang.reflect.Method.invokeNative(Native Method)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at java.lang.reflect.Method.invoke(Method.java:511)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
10-17 00:41:04.260: E/AndroidRuntime(27450):    at dalvik.system.NativeStart.main(Native Method)

我整晚都被这个问题困扰着。有什么方法可以复制文件吗?


你在classpath中标记了commons jar作为“export”吗?似乎它没有被排除在apk中。 - 323go
抱歉,我发现了一个可怕的错误,在修正了代码为 FileUtils.copyFile(source, desc); 之后,它现在按照预期执行了。仍然非常感谢你的帮助! - pearmak
要移动文件,这可能会有所帮助:(https://dev59.com/22855IYBdhLWcg3wuG6W#24841162) - Vinay Mundada
2个回答

37

经过以下修改后,它的运行良好:

    button1_save.setOnClickListener(new OnClickListener() 
    {
        public void onClick(View v) 
        {
            String sourcePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/TongueTwister/tt_temp.3gp";
            File source = new File(sourcePath);

            String destinationPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/TongueTwister/tt_1A.3gp";
            File destination = new File(destinationPath);
            try 
            {
                FileUtils.copyFile(source, destination);
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
    }); 

2
FileUtils在哪里?@pearmak - Developers Park
@APOORVADOSHI FileUtils 是 Apache commons io 包。要使用它,您必须将 commons-io.jar 添加到您的项目中。 - Nitish
FileUtils 轻松解决了问题,而且只需传递目标目录和源目录,它就会将整个目录复制到新目录中。 - Khay
3
在Android Gradle的依赖中添加如下代码:compile 'commons-io:commons-io:2.4',这将引入Commons IO库。 - Shivaraj Patil
FileUtils.copyFile() 函数在 DCIM 文件夹中会多复制一份文件! - Om Infowave Developers

6
在API 29级中,android添加了FileUtils类,该类具有复制功能。
使用以下代码复制您的文件:
public void copyFile(File source, File destination) throws IOException {
    FileUtils.copy(new FileInputStream(source), new FileOutputStream(destination));
}

如果Android Studio找不到类,那么说明你的compileSdkVersion低于29,此时您需要升级compileSdkVersion。
要升级,请转到应用程序级别的build.gradle文件,并将旧的替换为29。
像这样:
compileSdkVersion 29

如需了解有关FileUtils类的更多信息,请访问Android开发者网站 https://developer.android.com/reference/android/os/FileUtils


2
你需要将minSdkVersion增加到29,而不是compileSdkVersion。 - Hatzegopteryx
1
java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20210629_175744.jpg: open failed: EACCES (Permission denied) - Abraham Mathew
在调用此功能之前,请确保已经授予读写权限。 - Rohit Patil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接