C#:System.Diagnostics.Process.Start(“Explorer.exe”,@“/ select”+ FilePath)。文件名为unicode字符时无法打开文件

时间:2011-09-02 12:30:06

标签: c#

我想用窗口资源管理器打开文件的位置。我正在使用C#代码

System.Diagnostics.Process.Start("Explorer.exe", @"/select," + FilePath)

它适用于简单的英文字符,但如果文件的名称是Unicode字符(Thia语言),则无法打开文件的位置。

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:3)

尝试将其放在引号中:

System.Diagnostics.Process.Start("Explorer.exe", @"/select,""" + FilePath + "\"")

答案 1 :(得分:2)

此代码段没有问题:

    static void Main(string[] args) {
        string path = @"c:\temp\លួចស្រលាញ់សង្សារគេ.DAT";
        System.IO.File.WriteAllText(path, "hello");
        string txt = System.IO.File.ReadAllText(path);
    }

Windows 7,该文件已创建并在资源管理器中正确显示。您没有记录您的操作系统版本,因此这是一种失败模式,尽管是非常小的模式。更有可能是映射到E:驱动器的文件系统出现问题。像闪存驱动器或网络重定向器上的FAT32卷一样。分别在superuser.com和serverfault.com上提出相关问题。不要忘记记录这些基本细节。

答案 2 :(得分:0)

以下代码适用于包含韩文字符(unicode字符)的文件。请尝试一下,让我知道它是否有效。

       ...
       if (this.IsDirectory())
       {
          OpenFileWith("explorer.exe", this.FullPath, "/root,");
       }
       else
       {
          OpenFileWith("explorer.exe", this.FullPath, "/select,");
       }
      ...

    public static void OpenFileWith(string exePath, string path, string arguments)
    {
        if (path == null)
            return;

        try 
        {
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo.WorkingDirectory = Path.GetDirectoryName(path);
            if (exePath != null)
            {
                process.StartInfo.FileName = exePath;
                //Pre-post insert quotes for fileNames with spaces.
                process.StartInfo.Arguments = string.Format("{0}\"{1}\"", arguments, path);
            }
            else
            {
                process.StartInfo.FileName = path;
                process.StartInfo.WorkingDirectory = Path.GetDirectoryName(path);
            }
            if (!path.Equals(process.StartInfo.WorkingDirectory))
            {
                process.Start();
            }
        }
        catch(System.ComponentModel.Win32Exception ex) 
        {
            FormManager.DisplayException(ex, MessageBoxIcon.Information);
        }
    }

答案 3 :(得分:0)

如果您尝试打开的文件夹不存在,

资源管理器将转到默认文件夹,在这种情况下为“我的文档”。确保它存在。

答案 4 :(得分:0)

根据我的判断,以下是此交易:至少从Windows 8.1开始,“Explorer.exe”似乎在查找文件之前删除所有组合字符。您可以在c#或控制台中进行测试(首先执行chcp 65001以进入unicode模式)。如果你试图打开一个名为ปู(泰语为“螃蟹”)的目标它将无法正常工作,但是如果你删除元音标记以便你只有ป,它就会起作用。此外,如果您有一个名为ป的文件夹,并且您打开它,那么它将打开ป文件夹!

这解释了为什么其他一些开发者没有问题;问题不是非ascii :相反,它是具有可组合字符的文件名。并非所有语言都使用它们,即使在使用它们的语言中,并非所有文件都都使用它们。

好消息是,有一种不同的方法来打开这些没有这个问题,@ bert-huijben在this answer中描述

为了完整性,这里的版本类似于我最终使用的版本:

    [DllImport("shell32.dll", ExactSpelling = true)]
    public static extern void ILFree(IntPtr pidlList);

    [DllImport("shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
    public static extern IntPtr ILCreateFromPathW(string pszPath);

    [DllImport("shell32.dll", ExactSpelling = true)]
    public static extern int SHOpenFolderAndSelectItems(IntPtr pidlList, uint cild, IntPtr children, uint dwFlags);

    public void SelectItemInExplorer(string path)
    {
        var pidlList = ILCreateFromPathW(path);
        if(pidlList == IntPtr.Zero)
            throw new Exception(string.Format("ILCreateFromPathW({0}) failed",path));
        try
        {
            Marshal.ThrowExceptionForHR(SHOpenFolderAndSelectItems(pidlList, 0, IntPtr.Zero, 0));
        }
        finally
        {
            ILFree(pidlList);
        }
    }