当前位置: 首页 > 知识库问答 >
问题:

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

漆雕兴平
2023-03-14

我从用户的相册中获取了一张图像,并将其保存在一个文件夹中。

以下是代码:

   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");

                }

然后我读了图像,用代码改变了它的名字:

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");

                    }

但当我尝试用新名称重新加载图像时,我得到一个文件未找到异常,这是代码:

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"); }

这就是日志错误:

08-09 20:23:50.730 15052-15052/? W/System.err:java.io.FileNotFound异常:lol1.png: open失败: ENOENT(没有这样的文件或目录)08-09 20:23:50.743 15052-15052/?W/System.err:
在libcore.io.IoBridge.open(IoBridge.java:452)在java.io.FileInputStream.(16/>在android.app.ActivityT创建(我nstrumentation.java:1108)启动活动(ActivityThread. java: 2414)在android. app. ActivityThread. handleLaunchActive(ActivityThread. java: 2521)在android. app. ActivityThread. Access 900美元(ActivityThread. java: 150)在android. app. ActivityThread$H. handleMessage(ActivityThread. java: 1383)在android. os. Handler.调度消息(Handler. java: 102)在android. os. Looper. cle(Looper. java: 148)在java. lang. reect. ActivityThread. main(ActivityThread. java: 5517)。方法。调用(本机方法)在com. android. interal. os。ZygoteInit$法。java: 726)在com. android. interal. os。ZygoteInit. main(ZygoteInit. java: 616)由: android. system引起。错误异常:打开失败:在libcore. io. pos六. open(本机方法)在libcore. io. BlockGuardOS. open(BlockGuardOS. java: 186)在libcore. io. IoBridge. open(IoBridge. java: 438)...14更多08-09 20:23:50.744 15052-15052/? D/Image:第二次加载失败

共有1个答案

满言
2023-03-14

正如我们在评论中所讨论的,我相信您的renameTo()无法工作,因为文件中存在某种类型的保留,但您没有发布完整的代码,因此我不能完全确定。

使用您提供的代码,我创建了一个MainActivity,它完成了对存储在内部存储器(即pippo.png)中的文件的重命名。运行“活动”时,调试日志会证明重命名成功。

注意:在我下面的解决方案中,我只是创建文件,并将它们放在你说的应该去的地方,以便为你提供在你的应用程序中应该/可以如何使用renameTo()的答案,我实际上并没有处理图像,因为你没有向我提供你用来访问图像的代码。我相信您已经意识到了这一点,但您需要确保用户正确选择了您正在使用的图像,并且在将示例插入实际应用程序时,路径是准确的。

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");
        }

    }
}
 类似资料:
  • 问题内容: 我正在从Internet下载文件,并将流数据保存到getFilesDir()给定的应用程序内部存储中的临时文件中。 下载完成后,我需要将临时文件移动到外部存储器(通常是SD卡)上的下载目录中。但是由于某种原因,File.renameTo()对此不起作用。我猜是有问题的,因为它是两个单独的文件系统,但是我仍然可以直接下载到SD卡,并且文件URI是正确的。 是否有另一种简单快捷的方法将该文

  • 问题内容: 如何复制到外部存储保持,以便以后可以共享首选项。 试图读取并另存为一个文件,创建了类型,但我需要一个。想过遍历应用程序的内部存储和复制文件,然后将其放入外部存储,但这可能太复杂了。 真的很想知道是否存在一种简单而明智的方式来传递`sharedpreferences。 问题答案: 使用此代码, 并取回它, 注意 使用此代码只能处理字符串类型首选项,

  • 我正在完成Android的任务。 我从URL下载文件并保存在android手机的内部存储/目录中?我的代码写在下面,但这是外部存储代码,我想要内部存储代码。 这是外部存储代码,但我想保存在Android手机的内部存储中。

  • 我正在实施一个在Amazon S3中提供文件存储的应用程序,而用户使用普通文件进行操作 我有什么方法可以重命名/移动整个文件夹(从而递归地修改它的内容)? 或者我必须为每个资源手动实现递归解析和调用copy-delete吗? 谢谢

  • 我试图以编程方式(通过SPARQL查询或restendpoint)重命名ontotext graphdb存储库。 我可以使用这里记录的以下SPARQL删除旧存储库并插入新存储库,但是这会删除旧存储库中的所有数据 我可以手动将索引文件复制到这个新的存储库位置,但是是否有内置的gradb功能来完成此操作。

  • 我目前正在将spark数据帧存储为。Azure上blob存储中的csv文件。我正在使用以下代码。 这是可行的,但它会创建一个SmtRef。csv文件夹中的实际。csv文件存储为part-00000-tid。csv。如何指定实际的名称。csv文件? 提前感谢