C#中 Image.FromFile为何识别不了中文路径下的图片?

时间:2021-06-27 19:50:05
pictureBox1.Image = Image.FromFile(@s);
其中@s代表路径名,是由外部读取的。
如果路径名含有中文的路径,则报错,程序运行不了,如果将中文路径去掉,程序则运行正常。请问这个是什么原因?或者有没有其他方法读取指定路径下面的图片?

36 个解决方案

#1


@s 贴出来是什么

#2


如@s=F:\\my\\pic\\我.jpg或者是F:\\my\\我\\1.jpg 
因为@s代表的路径中含有中文,这个路径是绝对路径,所以pictureBox1.Image = Image.FromFile(@s);会出现异常,导致程序无法运行。

#3


引用 2 楼 sl1990129 的回复:
如@s=F:\\my\\pic\\我.jpg或者是F:\\my\\我\\1.jpg 
因为@s代表的路径中含有中文,这个路径是绝对路径,所以pictureBox1.Image = Image.FromFile(@s);会出现异常,导致程序无法运行。

什么异常,问题要把异常先贴出来。

#4


http://blog.csdn.net/chenfeiyang2009/article/details/5314200

#5


具体报什么错?
我测试代码没问题啊
string s=@"F:\下载\测试.png";
            this.pictureBox1.Image = Image.FromFile(s);

#6


你的冒号用全角中文?

#7


引用 5楼正怒月神 的回复:
具体报什么错?
我测试代码没问题啊
string s=@"F:\下载\测试.png";
            this.pictureBox1.Image = Image.FromFile(s);
先谢谢你们能解答!!!
嗯,直接给定中文路径没什么问题,但是通过打开目录然后再重新加载含有带中文的路径就会出现问题,导致程序无法启动debug调试模式

#8


引用 6楼以专业开发人员为伍 的回复:
你的冒号用全角中文?
这个我只是举例而已,程序里面的路径我是通过打开文件夹手动选择的

#9


说了半天都没能描述清楚你到底是什么出了问题。

#10


C#中 Image.FromFile为何识别不了中文路径下的图片?
路径是打开文件夹的路径,但是这个路径带有中文字符,所以再次加载这个路径的时候会出现软件异常

#11


例如:
路径:D:\照骗\2.jpg'WallControl.vshost.exe' (Managed): Loaded 'l4-1wkza'
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
软件异常:System.ArgumentException: 路径中具有非法字符。
   在 System.IO.Path.CheckInvalidPathChars(String path)
   在 System.IO.Path.NormalizePathFast(String path, Boolean fullCheck)
   在 System.IO.Path.NormalizePath(String path, Boolean fullCheck)
   在 System.IO.Path.GetFullPathInternal(String path)
   在 System.IO.Path.GetFullPath(String path)
   在 System.Drawing.IntSecurity.UnsafeGetFullPath(String fileName)
   在 System.Drawing.IntSecurity.DemandReadFileIO(String fileName)
   在 System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
   在 System.Drawing.Image.FromFile(String filename)

#12


中文路径是肯定没有问题的,问题不出在这里,这个时候应该找其他原因。

调用堆栈的栈顶的 CheckInvalidPathChars 方法是检查路径的非法字符的,中文并不是非法字符,你应该检查你的路径的非法字符。

#13


引用 12楼闭包客 的回复:
中文路径是肯定没有问题的,问题不出在这里,这个时候应该找其他原因。

调用堆栈的栈顶的 CheckInvalidPathChars 方法是检查路径的非法字符的,中文并不是非法字符,你应该检查你的路径的非法字符。
string path = @s;
              foreach (char invalidChar in Path.GetInvalidPathChars())
              {
                  path.Replace(invalidChar.ToString(), string.Empty);
                  Console.WriteLine("非法字符:" + invalidChar.ToString());
              }
先表示感谢!!!

这样可以不?我不太明白您的意思?能否举例一下说明

#14


你先手动改代码 为  D:\\照骗\\2.jpg 试一下

#15


补充说明一点,这个路径是从ini文件中读取的,然后再操作使用的,就发现读取含有中文的路径就会出现调试问题,显示路径不合法,各位大佬有没有什么合理的解决办法啊?在线等!

#16


请给出走狗的信息(包括代码)以使我们可以再现你遇到的问题

#17


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestPath
{
    public partial class Form1 : Form
    {
        private IniFiles settingFile;
        private string path;
       
        public Form1()
        {
            InitializeComponent();
            settingFile = new IniFiles (Application.StartupPath+ "\\setting.ini");
        }
        /// <summary>
        /// button1:打开选择图片路径的对话框
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openfile = new OpenFileDialog();
            openfile.Filter = "图片文件|*.bmp;*.jpg;*.jpeg;*.gif;*.png";
          
            if (openfile.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.ImageLocation = openfile.FileName;
                path = openfile.FileName;
                pictureBox1.Load(path);
                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox1.Image = Image.FromFile(path);
                settingFile.WriteString("SETTING", "path", path);//保存分辨率
            }          
            openfile.Dispose();
        }
        /// <summary>
        /// 加载之前显示的照骗
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            path = settingFile.ReadString("SETTING", "path", "path");
            Console.WriteLine(path);
            pictureBox1.Image = Image.FromFile(path);//出问题的地方
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
using System.Runtime.InteropServices;
using System.Collections;
using System.IO;

namespace TestPath
{
    public class IniFiles
    {
        public string FileName; //INI文件名
        //声明读写INI文件的API函数
        [DllImport("kernel32")]
        private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath);
        //类的构造函数,传递INI文件名
        public IniFiles(string AFileName)
        {
            // 判断文件是否存在
            FileInfo fileInfo = new FileInfo(AFileName);
            //Console.WriteLine(AFileName);
            //Todo:搞清枚举的用法
            if ((!fileInfo.Exists))
            { //|| (FileAttributes.Directory in fileInfo.Attributes))
                //文件不存在,建立文件
                System.IO.StreamWriter sw = new System.IO.StreamWriter(AFileName, false, System.Text.Encoding.Default);
                /*try
                {
                    sw.Write("#表格配置档案");
                    sw.Close();
                }
                catch
                {
                    throw (new ApplicationException("Ini文件不存在"));
                }*/
            }
            //必须是完全路径,不能是相对路径
            FileName = fileInfo.FullName;
        }
        //写INI文件
        public void WriteString(string Section, string Ident, string Value)
        {
            if (!WritePrivateProfileString(Section, Ident, Value, FileName))
            {
                throw (new ApplicationException("写Ini文件出错"));
            }
        }
        //读取INI文件指定
        public string ReadString(string Section, string Ident, string Default)
        {
            Byte[] Buffer = new Byte[65535];
            int bufLen = GetPrivateProfileString(Section, Ident, Default, Buffer, Buffer.GetUpperBound(0), FileName);
            //必须设定0(系统默认的代码页)的编码方式,否则无法支持中文
            string s = Encoding.GetEncoding(0).GetString(Buffer);
            s = s.Substring(0, bufLen);
            return s.Trim();
        }
        //读整数
        public int ReadInteger(string Section, string Ident, int Default)
        {
            string intStr = ReadString(Section, Ident, Convert.ToString(Default));
            try
            {
                return Convert.ToInt32(intStr);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return Default;
            }
        }
        //写整数
        public void WriteInteger(string Section, string Ident, int Value)
        {
            WriteString(Section, Ident, Value.ToString());
        }
        //读布尔
        public bool ReadBool(string Section, string Ident, bool Default)
        {
            try
            {
                return Convert.ToBoolean(ReadString(Section, Ident, Convert.ToString(Default)));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return Default;
            }
        }
        //写Bool
        public void WriteBool(string Section, string Ident, bool Value)
        {
            WriteString(Section, Ident, Convert.ToString(Value));
        }
        //从Ini文件中,将指定的Section名称中的所有Ident添加到列表中
        public void ReadSection(string Section, StringCollection Idents)
        {
            Byte[] Buffer = new Byte[16384];
            //Idents.Clear();
            int bufLen = GetPrivateProfileString(Section, null, null, Buffer, Buffer.GetUpperBound(0),
              FileName);
            //对Section进行解析
            GetStringsFromBuffer(Buffer, bufLen, Idents);
        }
        private void GetStringsFromBuffer(Byte[] Buffer, int bufLen, StringCollection Strings)
        {
            Strings.Clear();
            if (bufLen != 0)
            {
                int start = 0;
                for (int i = 0; i < bufLen; i++)
                {
                    if ((Buffer[i] == 0) && ((i - start) > 0))
                    {
                        String s = Encoding.GetEncoding(0).GetString(Buffer, start, i - start);
                        Strings.Add(s);
                        start = i + 1;
                    }
                }
            }
        }
        //从Ini文件中,读取所有的Sections的名称
        public void ReadSections(StringCollection SectionList)
        {
            //Note:必须得用Bytes来实现,StringBuilder只能取到第一个Section
            byte[] Buffer = new byte[65535];
            int bufLen = 0;
            bufLen = GetPrivateProfileString(null, null, null, Buffer,
             Buffer.GetUpperBound(0), FileName);
            GetStringsFromBuffer(Buffer, bufLen, SectionList);
        }
        //读取指定的Section的所有Value到列表中
        public void ReadSectionValues(string Section, NameValueCollection Values)
        {
            StringCollection KeyList = new StringCollection();
            ReadSection(Section, KeyList);
            Values.Clear();
            foreach (string key in KeyList)
            {
                Values.Add(key, ReadString(Section, key, ""));
            }
        }
        ////读取指定的Section的所有Value到列表中,
        //public void ReadSectionValues(string Section, NameValueCollection Values,char splitString)
        //{  string sectionValue;
        //  string[] sectionValueSplit;
        //  StringCollection KeyList = new StringCollection();
        //  ReadSection(Section, KeyList);
        //  Values.Clear();
        //  foreach (string key in KeyList)
        //  {
        //    sectionValue=ReadString(Section, key, "");
        //    sectionValueSplit=sectionValue.Split(splitString);
        //    Values.Add(key, sectionValueSplit[0].ToString(),sectionValueSplit[1].ToString());
        //  }
        //}
        //清除某个Section
        public void EraseSection(string Section)
        {
            if (!WritePrivateProfileString(Section, null, null, FileName))
            {
                throw (new ApplicationException("无法清除Ini文件中的Section"));
            }
        }
        //删除某个Section下的键
        public void DeleteKey(string Section, string Ident)
        {
            WritePrivateProfileString(Section, Ident, null, FileName);
        }
        //Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件
        //在Win NT, 2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile
        //执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。
        public void UpdateFile()
        {
            WritePrivateProfileString(null, null, null, FileName);
        }
        //检查某个Section下的某个键值是否存在
        public bool ValueExists(string Section, string Ident)
        {
            StringCollection Idents = new StringCollection();
            ReadSection(Section, Idents);
            return Idents.IndexOf(Ident) > -1;
        }
        //确保资源的释放
        ~IniFiles()
        {
            UpdateFile();
        }
    }
}
C#中 Image.FromFile为何识别不了中文路径下的图片?

#18


上面的程序是我复现的一个测试程序,问题出现的地方还是 pictureBox1.Image = Image.FromFile(path);这里,还麻烦各位大神帮忙看看,谢谢!

#19


引用 16楼xuzuning 的回复:
请给出走狗的信息(包括代码)以使我们可以再现你遇到的问题
谢谢您的回答,复现的程序已经贴下来了,请参考

#20


你用记事本打开 setting.ini 看看都有什么?并看一下 setting.ini 的字符集(另存为 就可看到)

#21


引用 20楼xuzuning 的回复:
你用记事本打开 setting.ini 看看都有什么?并看一下 setting.ini 的字符集(另存为 就可看到)
存储的路径没问题啊,我是路径里面包含中文出错,全英文路径是没有问题的啊

#22


我测试你的代码并没有发现出错,所以怀疑是字符集问题
你至少应截个图证明一下

#23


引用 8 楼 sl1990129 的回复:
Quote: 引用 6楼以专业开发人员为伍 的回复:
你的冒号用全角中文?
这个我只是举例而已,程序里面的路径我是通过打开文件夹手动选择的


你举例使用了手动给一个变量赋值的代码,这就根本看不出你原来的代码是怎么获得值的。这就相当于羞答答地隐藏身体,谁能诊断皮肤病啊?

#24


贴出你的真实的代码的调试画面。调试画面!

不要乱写一个无关的代码。

#25


引用 22楼xuzuning 的回复:
我测试你的代码并没有发现出错,所以怀疑是字符集问题
你至少应截个图证明一下
程序第一次执行没有问题,第二次重新打开再加载路径就有问题了,还有打开选择图片的路径要包含中文路径,第二次加载才会出现问题呀,我用的平台是vs2008

#26


引用 23楼以专业开发人员为伍 的回复:
Quote: 引用 8 楼 sl1990129 的回复:

Quote: 引用 6楼以专业开发人员为伍 的回复:
你的冒号用全角中文?
这个我只是举例而已,程序里面的路径我是通过打开文件夹手动选择的


你举例使用了手动给一个变量赋值的代码,这就根本看不出你原来的代码是怎么获得值的。这就相当于羞答答地隐藏身体,谁能诊断皮肤病啊?
谢谢您的作答,谢谢!测试代码已经列出了,一个程序是文件的读写用的,另外一个主窗体用于选择图片和现实图片,错误的条件是选择打开图片的路径要包含中文

#27


C#中 Image.FromFile为何识别不了中文路径下的图片?

现粘贴调试异常提醒:
'TestPath.vshost.exe' (Managed): Loaded 'C:\Users\user\Desktop\c#test\TestPath\TestPath\bin\x64\Release\TestPath.exe', Symbols loaded.
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
重载的路径:C:\Users\user\Desktop\照骗\2.jpg'TestPath.vshost.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
请问这是什么原因,用的vs2008 net3.5框架

#28


从表现来看,你的WriteString和ReadString方法,也就是写入文件,读出文件的内容应该是不一致,自己写测试方法,看看写入和读出的内容是否相同。

#29


而且出问题的时候path是什么值,你一直都没表述出来。

#30


引用 28楼cheng2005 的回复:
从表现来看,你的WriteString和ReadString方法,也就是写入文件,读出文件的内容应该是不一致,自己写测试方法,看看写入和读出的内容是否相同。
我打印出的内容是一致的

#31


引用 29楼cheng2005 的回复:
而且出问题的时候path是什么值,你一直都没表述出来。
path是选择的含用中文的路径名,写和读也是这个文件名,但是读写纯英文路径名没有问题的,所以才觉得奇怪,看是哪里出现问题

#32


引用 31 楼 sl1990129 的回复:
Quote: 引用 29楼cheng2005 的回复:
而且出问题的时候path是什么值,你一直都没表述出来。
path是选择的含用中文的路径名,写和读也是这个文件名,但是读写纯英文路径名没有问题的,所以才觉得奇怪,看是哪里出现问题

别用眼睛看,用程序去比对path的值,怎么沟通这么费劲呢...

#33


引用 32楼cheng2005 的回复:
Quote: 引用 31 楼 sl1990129 的回复:

Quote: 引用 29楼cheng2005 的回复:
而且出问题的时候path是什么值,你一直都没表述出来。
path是选择的含用中文的路径名,写和读也是这个文件名,但是读写纯英文路径名没有问题的,所以才觉得奇怪,看是哪里出现问题

别用眼睛看,用程序去比对path的值,怎么沟通这么费劲呢...
谢谢您的提醒!!!保存和读取为什么会导致长度不一样呢?虽然路径内容相同哈

#34


那99%是你操作那两个读写的API有问题,自己好好研究吧。
题外话,现在用ini存数据实在是太落后了。除了老项目不好改之外,新项目应该很少人用ini了。

#35


引用 34楼cheng2005 的回复:
那99%是你操作那两个读写的API有问题,自己好好研究吧。
题外话,现在用ini存数据实在是太落后了。除了老项目不好改之外,新项目应该很少人用ini了。
嗯嗯,好的,谢谢!还有能推荐一下当今保存数据的方式吗?什么比较高效和方便哈

#36


引用 35 楼 sl1990129 的回复:
Quote: 引用 34楼cheng2005 的回复:
那99%是你操作那两个读写的API有问题,自己好好研究吧。
题外话,现在用ini存数据实在是太落后了。除了老项目不好改之外,新项目应该很少人用ini了。
嗯嗯,好的,谢谢!还有能推荐一下当今保存数据的方式吗?什么比较高效和方便哈

xml比较通用,也常用,可以支持复杂的数据结构和层次。
文件数据库也可以。

#1


@s 贴出来是什么

#2


如@s=F:\\my\\pic\\我.jpg或者是F:\\my\\我\\1.jpg 
因为@s代表的路径中含有中文,这个路径是绝对路径,所以pictureBox1.Image = Image.FromFile(@s);会出现异常,导致程序无法运行。

#3


引用 2 楼 sl1990129 的回复:
如@s=F:\\my\\pic\\我.jpg或者是F:\\my\\我\\1.jpg 
因为@s代表的路径中含有中文,这个路径是绝对路径,所以pictureBox1.Image = Image.FromFile(@s);会出现异常,导致程序无法运行。

什么异常,问题要把异常先贴出来。

#4


http://blog.csdn.net/chenfeiyang2009/article/details/5314200

#5


具体报什么错?
我测试代码没问题啊
string s=@"F:\下载\测试.png";
            this.pictureBox1.Image = Image.FromFile(s);

#6


你的冒号用全角中文?

#7


引用 5楼正怒月神 的回复:
具体报什么错?
我测试代码没问题啊
string s=@"F:\下载\测试.png";
            this.pictureBox1.Image = Image.FromFile(s);
先谢谢你们能解答!!!
嗯,直接给定中文路径没什么问题,但是通过打开目录然后再重新加载含有带中文的路径就会出现问题,导致程序无法启动debug调试模式

#8


引用 6楼以专业开发人员为伍 的回复:
你的冒号用全角中文?
这个我只是举例而已,程序里面的路径我是通过打开文件夹手动选择的

#9


说了半天都没能描述清楚你到底是什么出了问题。

#10


C#中 Image.FromFile为何识别不了中文路径下的图片?
路径是打开文件夹的路径,但是这个路径带有中文字符,所以再次加载这个路径的时候会出现软件异常

#11


例如:
路径:D:\照骗\2.jpg'WallControl.vshost.exe' (Managed): Loaded 'l4-1wkza'
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
软件异常:System.ArgumentException: 路径中具有非法字符。
   在 System.IO.Path.CheckInvalidPathChars(String path)
   在 System.IO.Path.NormalizePathFast(String path, Boolean fullCheck)
   在 System.IO.Path.NormalizePath(String path, Boolean fullCheck)
   在 System.IO.Path.GetFullPathInternal(String path)
   在 System.IO.Path.GetFullPath(String path)
   在 System.Drawing.IntSecurity.UnsafeGetFullPath(String fileName)
   在 System.Drawing.IntSecurity.DemandReadFileIO(String fileName)
   在 System.Drawing.Image.FromFile(String filename, Boolean useEmbeddedColorManagement)
   在 System.Drawing.Image.FromFile(String filename)

#12


中文路径是肯定没有问题的,问题不出在这里,这个时候应该找其他原因。

调用堆栈的栈顶的 CheckInvalidPathChars 方法是检查路径的非法字符的,中文并不是非法字符,你应该检查你的路径的非法字符。

#13


引用 12楼闭包客 的回复:
中文路径是肯定没有问题的,问题不出在这里,这个时候应该找其他原因。

调用堆栈的栈顶的 CheckInvalidPathChars 方法是检查路径的非法字符的,中文并不是非法字符,你应该检查你的路径的非法字符。
string path = @s;
              foreach (char invalidChar in Path.GetInvalidPathChars())
              {
                  path.Replace(invalidChar.ToString(), string.Empty);
                  Console.WriteLine("非法字符:" + invalidChar.ToString());
              }
先表示感谢!!!

这样可以不?我不太明白您的意思?能否举例一下说明

#14


你先手动改代码 为  D:\\照骗\\2.jpg 试一下

#15


补充说明一点,这个路径是从ini文件中读取的,然后再操作使用的,就发现读取含有中文的路径就会出现调试问题,显示路径不合法,各位大佬有没有什么合理的解决办法啊?在线等!

#16


请给出走狗的信息(包括代码)以使我们可以再现你遇到的问题

#17


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TestPath
{
    public partial class Form1 : Form
    {
        private IniFiles settingFile;
        private string path;
       
        public Form1()
        {
            InitializeComponent();
            settingFile = new IniFiles (Application.StartupPath+ "\\setting.ini");
        }
        /// <summary>
        /// button1:打开选择图片路径的对话框
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openfile = new OpenFileDialog();
            openfile.Filter = "图片文件|*.bmp;*.jpg;*.jpeg;*.gif;*.png";
          
            if (openfile.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.ImageLocation = openfile.FileName;
                path = openfile.FileName;
                pictureBox1.Load(path);
                pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                pictureBox1.Image = Image.FromFile(path);
                settingFile.WriteString("SETTING", "path", path);//保存分辨率
            }          
            openfile.Dispose();
        }
        /// <summary>
        /// 加载之前显示的照骗
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            path = settingFile.ReadString("SETTING", "path", "path");
            Console.WriteLine(path);
            pictureBox1.Image = Image.FromFile(path);//出问题的地方
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
using System.Runtime.InteropServices;
using System.Collections;
using System.IO;

namespace TestPath
{
    public class IniFiles
    {
        public string FileName; //INI文件名
        //声明读写INI文件的API函数
        [DllImport("kernel32")]
        private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath);
        //类的构造函数,传递INI文件名
        public IniFiles(string AFileName)
        {
            // 判断文件是否存在
            FileInfo fileInfo = new FileInfo(AFileName);
            //Console.WriteLine(AFileName);
            //Todo:搞清枚举的用法
            if ((!fileInfo.Exists))
            { //|| (FileAttributes.Directory in fileInfo.Attributes))
                //文件不存在,建立文件
                System.IO.StreamWriter sw = new System.IO.StreamWriter(AFileName, false, System.Text.Encoding.Default);
                /*try
                {
                    sw.Write("#表格配置档案");
                    sw.Close();
                }
                catch
                {
                    throw (new ApplicationException("Ini文件不存在"));
                }*/
            }
            //必须是完全路径,不能是相对路径
            FileName = fileInfo.FullName;
        }
        //写INI文件
        public void WriteString(string Section, string Ident, string Value)
        {
            if (!WritePrivateProfileString(Section, Ident, Value, FileName))
            {
                throw (new ApplicationException("写Ini文件出错"));
            }
        }
        //读取INI文件指定
        public string ReadString(string Section, string Ident, string Default)
        {
            Byte[] Buffer = new Byte[65535];
            int bufLen = GetPrivateProfileString(Section, Ident, Default, Buffer, Buffer.GetUpperBound(0), FileName);
            //必须设定0(系统默认的代码页)的编码方式,否则无法支持中文
            string s = Encoding.GetEncoding(0).GetString(Buffer);
            s = s.Substring(0, bufLen);
            return s.Trim();
        }
        //读整数
        public int ReadInteger(string Section, string Ident, int Default)
        {
            string intStr = ReadString(Section, Ident, Convert.ToString(Default));
            try
            {
                return Convert.ToInt32(intStr);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return Default;
            }
        }
        //写整数
        public void WriteInteger(string Section, string Ident, int Value)
        {
            WriteString(Section, Ident, Value.ToString());
        }
        //读布尔
        public bool ReadBool(string Section, string Ident, bool Default)
        {
            try
            {
                return Convert.ToBoolean(ReadString(Section, Ident, Convert.ToString(Default)));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return Default;
            }
        }
        //写Bool
        public void WriteBool(string Section, string Ident, bool Value)
        {
            WriteString(Section, Ident, Convert.ToString(Value));
        }
        //从Ini文件中,将指定的Section名称中的所有Ident添加到列表中
        public void ReadSection(string Section, StringCollection Idents)
        {
            Byte[] Buffer = new Byte[16384];
            //Idents.Clear();
            int bufLen = GetPrivateProfileString(Section, null, null, Buffer, Buffer.GetUpperBound(0),
              FileName);
            //对Section进行解析
            GetStringsFromBuffer(Buffer, bufLen, Idents);
        }
        private void GetStringsFromBuffer(Byte[] Buffer, int bufLen, StringCollection Strings)
        {
            Strings.Clear();
            if (bufLen != 0)
            {
                int start = 0;
                for (int i = 0; i < bufLen; i++)
                {
                    if ((Buffer[i] == 0) && ((i - start) > 0))
                    {
                        String s = Encoding.GetEncoding(0).GetString(Buffer, start, i - start);
                        Strings.Add(s);
                        start = i + 1;
                    }
                }
            }
        }
        //从Ini文件中,读取所有的Sections的名称
        public void ReadSections(StringCollection SectionList)
        {
            //Note:必须得用Bytes来实现,StringBuilder只能取到第一个Section
            byte[] Buffer = new byte[65535];
            int bufLen = 0;
            bufLen = GetPrivateProfileString(null, null, null, Buffer,
             Buffer.GetUpperBound(0), FileName);
            GetStringsFromBuffer(Buffer, bufLen, SectionList);
        }
        //读取指定的Section的所有Value到列表中
        public void ReadSectionValues(string Section, NameValueCollection Values)
        {
            StringCollection KeyList = new StringCollection();
            ReadSection(Section, KeyList);
            Values.Clear();
            foreach (string key in KeyList)
            {
                Values.Add(key, ReadString(Section, key, ""));
            }
        }
        ////读取指定的Section的所有Value到列表中,
        //public void ReadSectionValues(string Section, NameValueCollection Values,char splitString)
        //{  string sectionValue;
        //  string[] sectionValueSplit;
        //  StringCollection KeyList = new StringCollection();
        //  ReadSection(Section, KeyList);
        //  Values.Clear();
        //  foreach (string key in KeyList)
        //  {
        //    sectionValue=ReadString(Section, key, "");
        //    sectionValueSplit=sectionValue.Split(splitString);
        //    Values.Add(key, sectionValueSplit[0].ToString(),sectionValueSplit[1].ToString());
        //  }
        //}
        //清除某个Section
        public void EraseSection(string Section)
        {
            if (!WritePrivateProfileString(Section, null, null, FileName))
            {
                throw (new ApplicationException("无法清除Ini文件中的Section"));
            }
        }
        //删除某个Section下的键
        public void DeleteKey(string Section, string Ident)
        {
            WritePrivateProfileString(Section, Ident, null, FileName);
        }
        //Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件
        //在Win NT, 2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile
        //执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。
        public void UpdateFile()
        {
            WritePrivateProfileString(null, null, null, FileName);
        }
        //检查某个Section下的某个键值是否存在
        public bool ValueExists(string Section, string Ident)
        {
            StringCollection Idents = new StringCollection();
            ReadSection(Section, Idents);
            return Idents.IndexOf(Ident) > -1;
        }
        //确保资源的释放
        ~IniFiles()
        {
            UpdateFile();
        }
    }
}
C#中 Image.FromFile为何识别不了中文路径下的图片?

#18


上面的程序是我复现的一个测试程序,问题出现的地方还是 pictureBox1.Image = Image.FromFile(path);这里,还麻烦各位大神帮忙看看,谢谢!

#19


引用 16楼xuzuning 的回复:
请给出走狗的信息(包括代码)以使我们可以再现你遇到的问题
谢谢您的回答,复现的程序已经贴下来了,请参考

#20


你用记事本打开 setting.ini 看看都有什么?并看一下 setting.ini 的字符集(另存为 就可看到)

#21


引用 20楼xuzuning 的回复:
你用记事本打开 setting.ini 看看都有什么?并看一下 setting.ini 的字符集(另存为 就可看到)
存储的路径没问题啊,我是路径里面包含中文出错,全英文路径是没有问题的啊

#22


我测试你的代码并没有发现出错,所以怀疑是字符集问题
你至少应截个图证明一下

#23


引用 8 楼 sl1990129 的回复:
Quote: 引用 6楼以专业开发人员为伍 的回复:
你的冒号用全角中文?
这个我只是举例而已,程序里面的路径我是通过打开文件夹手动选择的


你举例使用了手动给一个变量赋值的代码,这就根本看不出你原来的代码是怎么获得值的。这就相当于羞答答地隐藏身体,谁能诊断皮肤病啊?

#24


贴出你的真实的代码的调试画面。调试画面!

不要乱写一个无关的代码。

#25


引用 22楼xuzuning 的回复:
我测试你的代码并没有发现出错,所以怀疑是字符集问题
你至少应截个图证明一下
程序第一次执行没有问题,第二次重新打开再加载路径就有问题了,还有打开选择图片的路径要包含中文路径,第二次加载才会出现问题呀,我用的平台是vs2008

#26


引用 23楼以专业开发人员为伍 的回复:
Quote: 引用 8 楼 sl1990129 的回复:

Quote: 引用 6楼以专业开发人员为伍 的回复:
你的冒号用全角中文?
这个我只是举例而已,程序里面的路径我是通过打开文件夹手动选择的


你举例使用了手动给一个变量赋值的代码,这就根本看不出你原来的代码是怎么获得值的。这就相当于羞答答地隐藏身体,谁能诊断皮肤病啊?
谢谢您的作答,谢谢!测试代码已经列出了,一个程序是文件的读写用的,另外一个主窗体用于选择图片和现实图片,错误的条件是选择打开图片的路径要包含中文

#27


C#中 Image.FromFile为何识别不了中文路径下的图片?

现粘贴调试异常提醒:
'TestPath.vshost.exe' (Managed): Loaded 'C:\Users\user\Desktop\c#test\TestPath\TestPath\bin\x64\Release\TestPath.exe', Symbols loaded.
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
重载的路径:C:\Users\user\Desktop\照骗\2.jpg'TestPath.vshost.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
请问这是什么原因,用的vs2008 net3.5框架

#28


从表现来看,你的WriteString和ReadString方法,也就是写入文件,读出文件的内容应该是不一致,自己写测试方法,看看写入和读出的内容是否相同。

#29


而且出问题的时候path是什么值,你一直都没表述出来。

#30


引用 28楼cheng2005 的回复:
从表现来看,你的WriteString和ReadString方法,也就是写入文件,读出文件的内容应该是不一致,自己写测试方法,看看写入和读出的内容是否相同。
我打印出的内容是一致的

#31


引用 29楼cheng2005 的回复:
而且出问题的时候path是什么值,你一直都没表述出来。
path是选择的含用中文的路径名,写和读也是这个文件名,但是读写纯英文路径名没有问题的,所以才觉得奇怪,看是哪里出现问题

#32


引用 31 楼 sl1990129 的回复:
Quote: 引用 29楼cheng2005 的回复:
而且出问题的时候path是什么值,你一直都没表述出来。
path是选择的含用中文的路径名,写和读也是这个文件名,但是读写纯英文路径名没有问题的,所以才觉得奇怪,看是哪里出现问题

别用眼睛看,用程序去比对path的值,怎么沟通这么费劲呢...

#33


引用 32楼cheng2005 的回复:
Quote: 引用 31 楼 sl1990129 的回复:

Quote: 引用 29楼cheng2005 的回复:
而且出问题的时候path是什么值,你一直都没表述出来。
path是选择的含用中文的路径名,写和读也是这个文件名,但是读写纯英文路径名没有问题的,所以才觉得奇怪,看是哪里出现问题

别用眼睛看,用程序去比对path的值,怎么沟通这么费劲呢...
谢谢您的提醒!!!保存和读取为什么会导致长度不一样呢?虽然路径内容相同哈

#34


那99%是你操作那两个读写的API有问题,自己好好研究吧。
题外话,现在用ini存数据实在是太落后了。除了老项目不好改之外,新项目应该很少人用ini了。

#35


引用 34楼cheng2005 的回复:
那99%是你操作那两个读写的API有问题,自己好好研究吧。
题外话,现在用ini存数据实在是太落后了。除了老项目不好改之外,新项目应该很少人用ini了。
嗯嗯,好的,谢谢!还有能推荐一下当今保存数据的方式吗?什么比较高效和方便哈

#36


引用 35 楼 sl1990129 的回复:
Quote: 引用 34楼cheng2005 的回复:
那99%是你操作那两个读写的API有问题,自己好好研究吧。
题外话,现在用ini存数据实在是太落后了。除了老项目不好改之外,新项目应该很少人用ini了。
嗯嗯,好的,谢谢!还有能推荐一下当今保存数据的方式吗?什么比较高效和方便哈

xml比较通用,也常用,可以支持复杂的数据结构和层次。
文件数据库也可以。