打开路径中包含非法字符的文件

open file with Illegal characters in path

所以,我通过 GUID 复制图像并重命名它们,但没有遇到任何问题。 但是当我想将这张图片打开到 picturebox 中时,我得到了这个:

在调试器中生成的带有路径的名称如下所示:@"images\full_45e72053-440f-4f20-863c-3d80ef96876f.jpeg"

如何打开这个文件?

这是我的代码,显示了这个问题:

private void picBoxMini2_Click(object sender, EventArgs e)
        {
            string dir = ConfigurationManager.AppSettings["imageFolderPath"].ToString();
            string imgName = this.picBoxMini2.ImageLocation;
            string[] tmp = imgName.Split('_');
            this.picBoxMain.Image = Image.FromFile($"{dir}\full_{tmp[tmp.Length - 1]}");
        } 

ImageLocation 包含 100% 的信息,我保证了这种情况:

 string dir = ConfigurationManager.AppSettings["imageFolderPath"].ToString();
            if (imgs.Length >= 1)
            {
                this.picBoxMain.Image = Image.FromFile($@"{dir}\full_{imgs[0]}");
                this.picBoxMain.ImageLocation = $@"{dir}\full_{imgs[0]}";
                this.picBoxMini1.Image = Image.FromFile($@"{dir}_{imgs[0]}");
                this.picBoxMini1.ImageLocation = $@"{dir}_{imgs[0]}";

                this.picBoxMini2.Image = null;
                this.picBoxMini2.ImageLocation = null;
                this.picBoxMini3.Image = null;
                this.picBoxMini3.ImageLocation = null;
            }
            if (imgs.Length >= 2)
            {
                this.picBoxMini2.Image = Image.FromFile($@"{dir}_{imgs[1]}");
                this.picBoxMini2.ImageLocation = $@"{dir}_{imgs[1]}";
            }
            if (imgs.Length == 3)
            {
                this.picBoxMini3.Image = Image.FromFile($@"{dir}_{imgs[2]}");
                this.picBoxMini3.ImageLocation = $@"{dir}_{imgs[2]}";
            }

问题出在这一行:

this.picBoxMain.Image = Image.FromFile($"{dir}\full_{tmp[tmp.Length - 1]}");

您忘记了告诉编译器将字符串逐字处理的 @。没有那个标记,它认为你的路径有一个嵌入的 ctrl+f 字符(来自 \full 中的 \f),这不是 Windows.

中文件名的合法字符

您的选择是:

  • 包括 @this.picBoxMain.Image = Image.FromFile($@"{dir}\full_{tmp[tmp.Length - 1]}")
  • 转义目录分隔符:this.picBoxMain.Image = Image.FromFile($"{dir}\full_{tmp[tmp.Length - 1]}")
  • 使用 System.IO.Path.Combine 做一些其他的事情来自动处理目录/文件名分隔符。 this.picBoxMain.Image = Image.FromFile(System.IO.Path.Combine(dir, $"full_{tmp[tmp.Length - 1]}"))(这可能是最安全、最便携的解决方案,但对于您的需求来说可能有点过头了。)