Exemple #1
0
    /// <summary>
    /// Select file.
    /// </summary>
    /// <param name="owner">The owner.</param>
    /// <param name="multiSelect">can select multiple file</param>
    /// <param name="filterList">Filter list£¬odd is display name, even is comma seperated fileter list.</param>
    /// <param name="fileName">Default file name.</param>
    /// <param name="style">The style.</param>
    /// <returns></returns>
    public static string[] OpenFile(Window owner, bool multiSelect, string[] filterList, string fileName, DlgStyle style)
    {
        var info = new LPOPENFILENAME();

        if (owner == null)
        {
            owner = ZHApp.FrameworkMainWindow;
        }
        if (owner != null)
        {
            var wih = new WindowInteropHelper(owner);
            info.hwndOwner = wih.Handle;
        }
        if (filterList != null)
        {
            int r;
            Math.DivRem(filterList.Length, 2, out r);
            if (r != 0 || filterList.Length == 0)
            {
                filterList = ALL_FILES;
            }
        }
        if (filterList == null)
        {
            filterList = ALL_FILES;
        }
        info.lpstrFilter  = string.Join("\0", filterList) + "\0\0";
        info.nFilterIndex = 1;
        info.lpstrFile    = Marshal.StringToHGlobalUni((fileName ?? string.Empty).PadRight(1024, (char)0));
        info.nMaxFile     = 1024;
        info.Flags        = (multiSelect ? 0x200 : 0) | 0x00200000 | 0x00020000 | 0x00000800 | 0x00800000 | (int)style;
        info.lStructSize  = Marshal.SizeOf(typeof(LPOPENFILENAME));

        try
        {
            if (GetOpenFileNameW(ref info))
            {
                if (style == DlgStyle.Win95)
                {
                    var bytes = new List <byte>(2000);
                    for (int i = 0; i < 1024 * 2; i += 2)
                    {
                        var l = Marshal.ReadByte(info.lpstrFile, i);
                        var h = Marshal.ReadByte(info.lpstrFile, i + 1);
                        if (l == 0 && h == 0)
                        {
                            break;
                        }
                        bytes.Add(l);
                        bytes.Add(h);
                    }
                    var lpstrFile = Encoding.Unicode.GetString(bytes.ToArray());

                    if (multiSelect)
                    {
                        var ary = lpstrFile.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        if (ary.Length == 1)
                        {
                            return(ary);
                        }

                        var ret = new string[ary.Length - 1];
                        for (int i = 1; i < ary.Length; i++)
                        {
                            ret[i - 1] = System.IO.Path.Combine(ary[0], ary[i]);
                        }
                        return(ret);
                    }
                    else
                    {
                        return(new string[1] {
                            lpstrFile
                        });
                    }
                }
                else
                {
                    if (multiSelect)
                    {
                        var bytes = new List <byte>(2000);
                        int pl = -1, ph = -1;
                        for (int i = 0; i < 1024 * 2; i += 2)
                        {
                            var l = Marshal.ReadByte(info.lpstrFile, i);
                            var h = Marshal.ReadByte(info.lpstrFile, i + 1);
                            if (l == 0 && h == 0 && pl == 0 && ph == 0)
                            {
                                break;
                            }
                            pl = l; ph = h;
                            bytes.Add(l);
                            bytes.Add(h);
                        }
                        var lpstrFile = Encoding.Unicode.GetString(bytes.ToArray());

                        var ary = lpstrFile.Split(new[] { (char)0 }, StringSplitOptions.RemoveEmptyEntries);
                        if (ary.Length == 1)
                        {
                            return(ary);
                        }

                        var ret = new string[ary.Length - 1];
                        for (int i = 1; i < ary.Length; i++)
                        {
                            ret[i - 1] = System.IO.Path.Combine(ary[0], ary[i]);
                        }
                        return(ret);
                    }
                    else
                    {
                        var bytes = new List <byte>(2000);
                        for (int i = 0; i < 1024 * 2; i += 2)
                        {
                            var l = Marshal.ReadByte(info.lpstrFile, i);
                            var h = Marshal.ReadByte(info.lpstrFile, i + 1);
                            if (l == 0 && h == 0)
                            {
                                break;
                            }
                            bytes.Add(l);
                            bytes.Add(h);
                        }
                        var lpstrFile = Encoding.Unicode.GetString(bytes.ToArray());
                        return(new string[1] {
                            lpstrFile
                        });
                    }
                }
            }

            Marshal.FreeHGlobal(info.lpstrFile);
            return(new string[0]);
        }
        catch
        {
            Marshal.FreeHGlobal(info.lpstrFile);
            return(new string[0]);
        }
    }
Exemple #2
0
 static extern bool GetOpenFileNameW(ref LPOPENFILENAME lpofn);