简体   繁体   English

如何在内部存储中重命名文件?

[英]How to rename a file in internal Storage?

I have an image that I got from the user's album and I saved it in a folder. 我有一张从用户相册中获得的图像,并将其保存在一个文件夹中。

here is the code: 这是代码:

   filename = "pippo.png";

             try {
                    ContextWrapper cw = new ContextWrapper(getApplicationContext());
                    File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);

                    // Create imageDir
                    File myPath = new File(directory,filename);

                    FileOutputStream out = new FileOutputStream(myPath);

                    theImage.compress(Bitmap.CompressFormat.PNG, 90, out);
                    out.flush();
                    out.close();
                    Log.d("Image","saved success");

                   picture =  directory.getAbsolutePath();

                } catch (Exception e) {
                    e.printStackTrace();
                    Log.d("Image","saved failed");

                }

Then i read the image and change its name by that code: 然后我读取图像并通过该代码更改其名称:

if(comingIntent.hasExtra("FILEPATH"))
                {

                    filePath = comingIntent.getStringExtra("FILEPATH");
                    String filename = "pippo.png";

                    try {
                        File f = new File(filePath, filename);
                        Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
                        playerImage.setImageBitmap(b);

                        File newfile = new File(filePath,username+".png");
                        f.renameTo(newfile);
                        Log.d("Image","first load succcess");

                    }
                    catch (FileNotFoundException e)
                    {
                        e.printStackTrace();
                        Log.d("Image","first load failed");

                    }

But then when I try to reload the image with its new name, I get a file not found exception, that's the code: 但是,当我尝试使用新名称重新加载图像时,出现文件未找到异常的代码:

try {
       File f = new File(filePath, username+".png");
       Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
       playerImage.setImageBitmap(b);

       Log.d("Image","second load succcess");  }

 catch (FileNotFoundException e)
       {
         e.printStackTrace();
         Log.d("Image","second load failed"); }

That's the Log error: 那是Log错误:

08-09 20:23:50.730 15052-15052/? 08-09 20:23:50.730 15052-15052 /? W/System.err: java.io.FileNotFoundException: lol1.png: open failed: ENOENT (No such file or directory) 08-09 20:23:50.743 15052-15052/? W / System.err:java.io.FileNotFoundException:lol1.png:打开失败:ENOENT(没有这样的文件或目录)08-09 20:23:50.743 15052-15052 /? W/System.err: W / System.err的:
at libcore.io.IoBridge.open(IoBridge.java:452) at java.io.FileInputStream.(FileInputStream.java:76) at com.example.abzo.socsoc.PlayerHomePage.onCreate(PlayerHomePage.java:103) at android.app.Activity.performCreate(Activity.java:6285) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2414) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2521) at android.app.ActivityThread.access$900(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1383) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5517) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: android.system.ErrnoExcept 在libcore.io.IoBridge.open(IoBridge.java:452)在android.com.example.abzo.socsoc.PlayerHomePage.onCreate(PlayerHomePage.java:103)在java.io.FileInputStream。(FileInputStream.java:76) android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2414)处的.app.Activity.performCreate(Activity.java:6285)。 android.app.ActivityThread.access上的handleLaunchActivity(ActivityThread.java:2521).android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1383)上的android.os.Handler.dispatchMessage($ 900(ActivityThread.java:150)) android.os.Looper.loop(Looper.java:148)处的Handler.java:102)java.lang.reflect.Method.invoke(本机方法)处android.app.ActivityThread.main(ActivityThread.java:5517)处的Handler.java:102)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)处com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)在此原因:android.system.ErrnoExcept ion: open failed: ENOENT (No such file or directory) at libcore.io.Posix.open(Native Method) at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) at libcore.io.IoBridge.open(IoBridge.java:438) ... 14 more 08-09 20:23:50.744 15052-15052/? ion:打开失败:libcore.io.IoBridge.open(IoBridge)的libcore.io.Bs.guard.open(BlockGuardOs.java:186)的libcore.io.Posix.open(本机方法)处的ENOENT(没有此类文件或目录) .java:438)...还有14个08-09 20:23:50.744 15052-15052 /? D/Image: second load failed D /图像:第二次加载失败

As we discussed in the comments, I believe your renameTo() is not working because of some type of hold on the file, but you did not post your full code so I cannot be completely sure. 正如我们在评论中讨论的那样,由于文件上的某种保留类型,我认为您的namedTo()无法正常工作,但是您没有发布完整的代码,因此我不能完全确定。

With the code you provided, I have created a MainActivity that accomplishes a rename of the file you noted that was stored in Internal Storage (ie pippo.png). 使用您提供的代码,我创建了一个MainActivity ,可以对存储在内部存储器 (即pippo.png)中的文件进行重命名。 The successful rename is proved in the debug logs when you run the Activity. 运行活动时,将在调试日志中证明成功的重命名。

Note: In my solution below I am just creating Files and placing them where you said they are supposed to go to provide you an answer of how renameTo() should/can be used in your app, I am not actually working with images as you did not provide me with your code that you use to access the images. 注意:在下面的解决方案中,我只是创建文件并将其放置在您说应该去的位置,以提供有关应如何/可以在您的应用程序中使用renameTo()的答案,我实际上并没有在处理图像没有向我提供您用于访问图像的代码。 I'm sure you realize this, but you will need to be sure the image you are working with is being selected correctly by the user and the path is accurate for my example to work when you plug it into your real application. 我相信您已经意识到了这一点,但是您需要确保用户正确选择了正在使用的图像,并且当您将其插入到实际应用程序中时,路径对于我的示例来说是正确的。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String imageFilename = "pippo.png";
        //example username, I am not sure how you get this info
        String exampleUsername = "user1";   

        try {
            ContextWrapper cw = new ContextWrapper(getApplicationContext());
            File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
            //check that we are good here...
            if(directory.exists())
                Log.d("ImageTAG", "'imageDir' exists");

            // create imageDir
            File completeImagePath = new File(directory, imageFilename);

            //write file
            FileOutputStream out = new FileOutputStream(completeImagePath);

            out.flush();
            out.close();

            //check to ensure complete image path exists... it should
            if(completeImagePath.exists())
                Log.d("ImageTAG", "'completeImagePath' exists");

            //show full path on device
            Log.d("ImageTAG", "Image saved success, complete Image Path: " +
                    completeImagePath.getAbsolutePath());

            //redeclaration of file here is not needed, but added for clarity
            File from = new File(completeImagePath.getAbsolutePath());
            //what you are renaming the file to
            File to = new File(directory, exampleUsername + ".png");
            //now rename
            Boolean success = from.renameTo(to);

            Log.d("ImageTAG", "Successful Rename: "+success.toString()+"| File is now named: "+to.getPath());

        } catch (Exception e) {
            e.printStackTrace();
            Log.d("ImageTAG","saved failed");
        }

    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM