private string BrowseForFileSave(IntPtr owner, string filter, string initialPath = null, string title = null) { if (string.IsNullOrEmpty(initialPath)) { initialPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + Path.DirectorySeparatorChar; } var uiShell = _shell.GetService <IVsUIShell>(typeof(SVsUIShell)); if (null == uiShell) { return(null); } if (owner == IntPtr.Zero) { ErrorHandler.ThrowOnFailure(uiShell.GetDialogOwnerHwnd(out owner)); } var saveInfo = new VSSAVEFILENAMEW[1]; saveInfo[0].lStructSize = (uint)Marshal.SizeOf(typeof(VSSAVEFILENAMEW)); saveInfo[0].dwFlags = 0x00000002; // OFN_OVERWRITEPROMPT saveInfo[0].pwzFilter = filter.Replace('|', '\0') + "\0"; saveInfo[0].hwndOwner = owner; saveInfo[0].pwzDlgTitle = title; saveInfo[0].nMaxFileName = 260; var pFileName = Marshal.AllocCoTaskMem(520); saveInfo[0].pwzFileName = pFileName; saveInfo[0].pwzInitialDir = Path.GetDirectoryName(initialPath); var nameArray = (Path.GetFileName(initialPath) + "\0").ToCharArray(); Marshal.Copy(nameArray, 0, pFileName, nameArray.Length); try { int hr = uiShell.GetSaveFileNameViaDlg(saveInfo); if (hr == VSConstants.OLE_E_PROMPTSAVECANCELLED) { return(null); } ErrorHandler.ThrowOnFailure(hr); return(Marshal.PtrToStringAuto(saveInfo[0].pwzFileName)); } finally { if (pFileName != IntPtr.Zero) { Marshal.FreeCoTaskMem(pFileName); } } }
/// <summary> /// Displays the Open File dialog and allows the user to select a file. /// </summary> /// <param name="filter">Mandatory filter such as "C# Files (*.cs)|*.cs"</param> /// <param name="initialPath">Optional initial file path</param> /// <param name="title">Optional dialog title</param> /// <returns></returns> public static string FileSave(string filter, string initialPath = null, string title = null) { var uiShell = UiShell; if (uiShell == null) { return(null); } uiShell.GetDialogOwnerHwnd(out var owner); var saveInfo = new VSSAVEFILENAMEW[1]; saveInfo[0].lStructSize = (uint)Marshal.SizeOf(typeof(VSSAVEFILENAMEW)); saveInfo[0].pwzFilter = filter.Replace('|', '\0') + "\0"; saveInfo[0].hwndOwner = owner; saveInfo[0].pwzDlgTitle = title; saveInfo[0].nMaxFileName = 260; var pFileName = Marshal.AllocCoTaskMem(520); saveInfo[0].pwzFileName = pFileName; saveInfo[0].pwzInitialDir = Path.GetDirectoryName(initialPath); var nameArray = (Path.GetFileName(initialPath) + "\0").ToCharArray(); Marshal.Copy(nameArray, 0, pFileName, nameArray.Length); try { int hr = uiShell.GetSaveFileNameViaDlg(saveInfo); if (hr == VSConstants.OLE_E_PROMPTSAVECANCELLED) { return(null); } ErrorHandler.ThrowOnFailure(hr); return(Marshal.PtrToStringAuto(saveInfo[0].pwzFileName)); } finally { if (pFileName != IntPtr.Zero) { Marshal.FreeCoTaskMem(pFileName); } } }
private static string BrowseForFileSave(IntPtr owner, string filter, string initialPath = null, string title = null) { if (string.IsNullOrEmpty(initialPath)) { initialPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + Path.DirectorySeparatorChar; } IVsUIShell uiShell = VsAppShell.Current.GetGlobalService<IVsUIShell>(typeof(SVsUIShell)); if (null == uiShell) { return null; } if (owner == IntPtr.Zero) { ErrorHandler.ThrowOnFailure(uiShell.GetDialogOwnerHwnd(out owner)); } VSSAVEFILENAMEW[] saveInfo = new VSSAVEFILENAMEW[1]; saveInfo[0].lStructSize = (uint)Marshal.SizeOf(typeof(VSSAVEFILENAMEW)); saveInfo[0].dwFlags = 0x00000002; // OFN_OVERWRITEPROMPT saveInfo[0].pwzFilter = filter.Replace('|', '\0') + "\0"; saveInfo[0].hwndOwner = owner; saveInfo[0].pwzDlgTitle = title; saveInfo[0].nMaxFileName = 260; var pFileName = Marshal.AllocCoTaskMem(520); saveInfo[0].pwzFileName = pFileName; saveInfo[0].pwzInitialDir = Path.GetDirectoryName(initialPath); var nameArray = (Path.GetFileName(initialPath) + "\0").ToCharArray(); Marshal.Copy(nameArray, 0, pFileName, nameArray.Length); try { int hr = uiShell.GetSaveFileNameViaDlg(saveInfo); if (hr == VSConstants.OLE_E_PROMPTSAVECANCELLED) { return null; } ErrorHandler.ThrowOnFailure(hr); return Marshal.PtrToStringAuto(saveInfo[0].pwzFileName); } finally { if (pFileName != IntPtr.Zero) { Marshal.FreeCoTaskMem(pFileName); } } }
public static string BrowseForFileSave(this IServiceProvider provider, IntPtr owner, string filter, string initialPath = null) { if (string.IsNullOrEmpty(initialPath)) { initialPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + Path.DirectorySeparatorChar; } IVsUIShell uiShell = provider.GetService(typeof(SVsUIShell)) as IVsUIShell; if (null == uiShell) { using (var sfd = new System.Windows.Forms.SaveFileDialog()) { sfd.AutoUpgradeEnabled = true; sfd.Filter = filter; sfd.FileName = Path.GetFileName(initialPath); sfd.InitialDirectory = Path.GetDirectoryName(initialPath); DialogResult result; if (owner == IntPtr.Zero) { result = sfd.ShowDialog(); } else { result = sfd.ShowDialog(NativeWindow.FromHandle(owner)); } if (result == DialogResult.OK) { return(sfd.FileName); } else { return(null); } } } if (owner == IntPtr.Zero) { ErrorHandler.ThrowOnFailure(uiShell.GetDialogOwnerHwnd(out owner)); } VSSAVEFILENAMEW[] saveInfo = new VSSAVEFILENAMEW[1]; saveInfo[0].lStructSize = (uint)Marshal.SizeOf(typeof(VSSAVEFILENAMEW)); saveInfo[0].pwzFilter = filter.Replace('|', '\0') + "\0"; saveInfo[0].hwndOwner = owner; saveInfo[0].nMaxFileName = 260; var pFileName = Marshal.AllocCoTaskMem(520); saveInfo[0].pwzFileName = pFileName; saveInfo[0].pwzInitialDir = Path.GetDirectoryName(initialPath); var nameArray = (Path.GetFileName(initialPath) + "\0").ToCharArray(); Marshal.Copy(nameArray, 0, pFileName, nameArray.Length); try { int hr = uiShell.GetSaveFileNameViaDlg(saveInfo); if (hr == VSConstants.OLE_E_PROMPTSAVECANCELLED) { return(null); } ErrorHandler.ThrowOnFailure(hr); return(Marshal.PtrToStringAuto(saveInfo[0].pwzFileName)); } finally { if (pFileName != IntPtr.Zero) { Marshal.FreeCoTaskMem(pFileName); } } }
int IVsUIShell.GetSaveFileNameViaDlg(VSSAVEFILENAMEW[] saveFileName) { throw new NotImplementedException(); }
public static string BrowseForFileSave( IntPtr owner, string filter, string initialPath = null, string title = null ) { if (string.IsNullOrEmpty(initialPath)) { initialPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + Path.DirectorySeparatorChar; } IVsUIShell uiShell = GetService(typeof(SVsUIShell)) as IVsUIShell; if (null == uiShell) { using (var sfd = new System.Windows.Forms.SaveFileDialog()) { sfd.AutoUpgradeEnabled = true; sfd.Filter = filter; sfd.FileName = Path.GetFileName(initialPath); sfd.InitialDirectory = Path.GetDirectoryName(initialPath); if (!string.IsNullOrEmpty(title)) { sfd.Title = title; } DialogResult result; if (owner == IntPtr.Zero) { result = sfd.ShowDialog(); } else { result = sfd.ShowDialog(NativeWindow.FromHandle(owner)); } if (result == DialogResult.OK) { return sfd.FileName; } else { return null; } } } if (owner == IntPtr.Zero) { ErrorHandler.ThrowOnFailure(uiShell.GetDialogOwnerHwnd(out owner)); } VSSAVEFILENAMEW[] saveInfo = new VSSAVEFILENAMEW[1]; saveInfo[0].lStructSize = (uint)Marshal.SizeOf(typeof(VSSAVEFILENAMEW)); saveInfo[0].pwzFilter = filter.Replace('|', '\0') + "\0"; saveInfo[0].hwndOwner = owner; saveInfo[0].pwzDlgTitle = title; saveInfo[0].nMaxFileName = 260; var pFileName = Marshal.AllocCoTaskMem(520); saveInfo[0].pwzFileName = pFileName; saveInfo[0].pwzInitialDir = Path.GetDirectoryName(initialPath); var nameArray = (Path.GetFileName(initialPath) + "\0").ToCharArray(); Marshal.Copy(nameArray, 0, pFileName, nameArray.Length); try { int hr = uiShell.GetSaveFileNameViaDlg(saveInfo); if (hr == VSConstants.OLE_E_PROMPTSAVECANCELLED) { return null; } ErrorHandler.ThrowOnFailure(hr); return Marshal.PtrToStringAuto(saveInfo[0].pwzFileName); } finally { if (pFileName != IntPtr.Zero) { Marshal.FreeCoTaskMem(pFileName); } } }
public int GetSaveFileNameViaDlg(VSSAVEFILENAMEW[] pSaveFileName) { throw new NotImplementedException(); }