打开路径中包含非法字符的文件
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]}"))
(这可能是最安全、最便携的解决方案,但对于您的需求来说可能有点过头了。)
所以,我通过 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]}"))
(这可能是最安全、最便携的解决方案,但对于您的需求来说可能有点过头了。)