InitialDirectory ์์ฑ์ด ๋ก์ปฌ ๋ฐ ๊ธฐ์กด ํด๋๋ก ์ค์ ๋ ๋ํ ์์๋ฅผ ์ด๊ธฐํํ๋ ๊ฒ์ ๋ฌด์๋ฉ๋๋ค.
๋ํ ์์์๋ ํญ์ ํ์ผ์ด ์ด๋ฆฐ ๋ง์ง๋ง ํด๋๊ฐ ํ์๋ฉ๋๋ค.
VistaOpenFileDialog dialog = new VistaOpenFileDialog();
dialog.Filter = "JSON Dateien (*.json)|*.json";
dialog.InitialDirectory = "C:\\";
์์๋๋ ๋์ :
VistaOpenFileDialog๋ InitialDirectory๊ฐ "C : \"๋ก ์ค์ ๋์ด์์ ๋ ํญ์ C : \์ ๋ด์ฉ์ ํ์ํฉ๋๋ค.
Windows 10 Pro 1903 / .Net Framework 4.6
@soulflyman์ ์ ๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ Windows์ ํจ๊ป ์ ๊ณต๋๋ ๋ค๋ฅธ ๋ชจ๋ ์ฑ์์ ๋ฐ์ํ๋ ๊ฒ๊ณผ ์ผ์นํ๋ฏ๋ก "์ฌ๋ฐ๋ฅธ"๋์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉํ ํด๋๋ฅผ ๊ธฐ์ตํฉ๋๋ค.
๋ฉ๋ชจ์ฅ์ด๋ ๊ทธ๋ฆผํ์ ์ฌ์ฉํ์ฌ ๋์ผํ๊ฒ ์ฌํ ํ ์ ์์ด์ผํฉ๋๋ค.
@buildcomplete ๋ PR # 2์ ์ ์ฌํ ๋ฌธ์ ๋ฅผ๋ณด๊ณ
๋๋จํ๊ฒ ๋ค๋ฆฌ ๋ค์. ๋ง์ ๋๋ฆฐ๋๋ก ์๋ก์ด ์ค์ ์ผ๋ก ์ ์ ์ผ๋ก ๊ด์ฐฎ์ต๋๋ค.
๊ธฐ๋ณธ ๋์ (์ : ๋ฉ๋ชจ์ฅ)์ ์๊ณ ์์์ง๋ง InitialDirectory๊ฐ ์๋์ผ๋ก ์ค์ ๋๋ฉด์ด ๋์์ด ๋ณ๊ฒฝ ๋ ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค.
๋ด ๊ฐ์ ์ InitialDirectory๊ฐ ๋ํ ์์๊ฐ ํ์ ๋ ๋๋ง๋ค ๋๋ ์ ์ด๋์ด ์คํ์ค์ธ ์์ฉ ํ๋ก๊ทธ๋จ ์ธ์คํด์ค์ ํ์๋๋ ๋๋ ํฐ๋ฆฌ๋ผ๋ ์๋ฏธ์์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ซ๊ณ ๋ค์ ์์ํ ํ์๋ ๋ฌด์๋์ง ์์ ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค.
๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ค์ํ VistaSaveFileDialog ์์ฑ์ ์ค์ ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ / ์์๋ก ์คํํ์ง๋ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. ๋ํ ์์๋ ํญ์ InitialDirectoy ์ค์ ์ ๋ฌด์ํ๊ณ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
VistaFileDialog.cs์์ '_initialDirectory'๊ฐ ์ํ๋ ๊ฒฝ๋ก๋ก ์ค์ ๋์์์ ํ์ธํ์ต๋๋ค.
๊ฑฐ๊ธฐ์์ ๊ฐ์ NativeMethods.cs์ CreateItemFromParsingName(string path)
๋ก ์ด๋ ํ ๋ค์ COM ๊ตฌ๋ฉ ์๋๋ก ์ฌ๋ผ์ง๋๋ค.
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
public static extern int SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string pszPath, IntPtr pbc, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);
public static Interop.IShellItem CreateItemFromParsingName(string path)
{
object item;
Guid guid = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe"); // IID_IShellItem
int hr = NativeMethods.SHCreateItemFromParsingName(path, IntPtr.Zero, ref guid, out item);
if( hr != 0 )
throw new System.ComponentModel.Win32Exception(hr);
return (Interop.IShellItem)item;
}
๋ฐํ ๋ COM ๊ฐ์ฒด๊ฐ null ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์์ด SHCreateItemFromParsingName
๋ฉ์๋๊ฐ ์คํจํ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฉ์๋ ์๋ช
์ SetLastError = true๋ฅผ ์ถ๊ฐํ๊ณ ํธ์ถ ํ Marshal.GetLastWin32Error()
์ ์๋ํ์ง๋ง 0์ ๋ฐํํฉ๋๋ค.
๋ง์ Windows ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ง์ง๋ง ๊ฒฝ๋ก๋ฅผ ๊ธฐ์ตํ๋ "์ค๋งํธ ํ"๊ธฐ๋ณธ ๋์์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ฌ์ค์ด์ง๋ง, ์ฑ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉ์๋ฅผ ๋๊ธฐ ์ํด ํน์ ์ด๊ธฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํน์ ํ๋ก์ ํธ ๊ด๋ จ ๋๋ ํ ๋ฆฌ์์๋ก๋ / ์ ์ฅํ ๊ฒ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์ ๊ฒฝ์ฐ ์ด๋ ๊ธฐ๋ณธ ๋์์ ๋๋ค. notepad / paint / word์์ "smart"๋ง์ง๋ง ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฑ ๊ฐ์๊ณ ์ธ๋ชจ๊ฐ ์์ต๋๋ค.
๊ฒ๋ค๊ฐ : Microsoft.Win32.OpenFileDialog
๋ ๋๊ฐ์ ์์ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์์๋๋ก ์ฌ์ฉํฉ๋๋ค.
๋๋ ๊ฐ์ ํ์๊ฐ ์์ต๋๋ค.
๋ํ ์์ ์ด๊ธฐ ๋๋ ํ ๋ฆฌ๋ฅผ ์ค์ ํ ์์๋ ์ค์ ์ ์ถ๊ฐํด ์ฃผ์๊ฒ ์ต๋๊น?
๊ฐ์ฌํฉ๋๋ค.
๋๋ Ookii ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ๋ค์ด๊ฐ๋ค. ๊ทธ๋ฐ ๋ค์ InitialDirectory
์์ฑ์ ๊ณ ๋ คํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค.
์ด ์ฝ๋ ์ค์ VistaFileDialog.cs
ํ์ผ๋ก ๋ณ๊ฒฝํด์ผํฉ๋๋ค.
internal virtual void SetDialogProperties(Ookii.Dialogs.Wpf.Interop.IFileDialog dialog)
๋ฉ์๋๋ก
์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝ
// Initial directory
if( !string.IsNullOrEmpty(_initialDirectory) )
{
Ookii.Dialogs.Wpf.Interop.IShellItem item = NativeMethods.CreateItemFromParsingName(_initialDirectory);
dialog.SetDefaultFolder(item);
}
...์
// Initial directory
if( !string.IsNullOrEmpty(_initialDirectory) )
{
Ookii.Dialogs.Wpf.Interop.IShellItem item = NativeMethods.CreateItemFromParsingName(_initialDirectory);
dialog.SetFolder(item);
}
๋๋ฌ์ต๋๋ค.
์ด์ Ookii ๋ํ ์์๊ฐ InitialDirectory
์์ฑ์ผ๋ก ์์๋ฉ๋๋ค.
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@ gitjsdr26 ๋น์ ์ @augustoproiete์ ๋ํ ํ๋ณด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค
@nzain , ์ฃ์กํฉ๋๋ค. GitHub๋ก์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ข์, ๋๋์ด ๋ฌธ์ ๋ฅผ ๋ฐํ๊ธฐ ์ํด ๋ ๋ง์ ์ ๋ณด๋ฅผ ๋ชจ์๋ค.
WPF์ OpenFileDialog.InitialDirectory์ ๋ํด ๋ฌธ์ํ ๋ ๊ฒ๊ณผ ๊ฐ์ InitialDirectory
์์ฑ์ ๋ํด ์ด์ผ๊ธฐํฉ๋๋ค. ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
ํ์ผ ๋ํ ์์์ ํ์๋๋ ์ด๊ธฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ ธ ์ค๊ฑฐ๋ ์ค์ ํฉ๋๋ค.
Ookii Dialogs ์ฌ์ฉ์๋ ์์ฑ์ ์ด๋ฆ์ด ๋์ผํ๊ธฐ ๋๋ฌธ์ ๋์ผํ ๋์์ ๊ธฐ๋ํฉ๋๋ค. ๋์ํฉ๋๋ค. ๋ง์ ์ํฉ์์์ด ์์ฑ์ ์ค์ ํด์๋ ์๋ฉ๋๋ค (๋ฉ๋ชจ์ฅ ๋ฑ). ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ค๋ฅธ ์ด์ผ๊ธฐ์ ๋๋ค. _ ์์ฑ์ด ์ค์ ๋๋ฉด ์์๋๋ก ์๋ํฉ๋๋ค.
InitialDirectory
๋ฅผ ํ์ฌ ํธ์ถ ๋ IFileDialog::SetDefaultFolder
์ ํผ๋ํ์ง ๋ง์ญ์์ค. ์ฌ๊ธฐ์ ๋ฌธ์๊ฐ ๋งํฉ๋๋ค.
์ต๊ทผ์ ์ฌ์ฉ ๋ ํด๋ ๊ฐ์ด์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ ํด๋๋ฅผ ์ค์ ํฉ๋๋ค.
์ด๊ฒ์ด (์ต๊ทผ์ ์ฌ์ฉ ๊ฐ๋ฅํ ํด๋๊ฐ ์์) ๊ฒฝ์ฐ์ธ์ง ํ์คํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ ํด๋๋ฅผ ์ค์ ํด๋ ์๋ฌด๋ฐ ํจ๊ณผ๊ฐ ์์์ต๋๋ค. ํด๋น ๊ธฐ๋ฅ์ด ๋๊ตฌ์๊ฒ๋ ํ์ํ ๊ฒฝ์ฐ DefaultDirectory
์์ฑ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์ผํฉ๋๋ค. ์์ ์ ์ธ๋ชจ์๋ ์ ๋ฌผ ์ผ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ธ์ ํจ๊ณผ๊ฐ ์๋์ง ์๋ ์ฌ๋์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
# 2 PR์ ํ์ฌ 2 ๋
๋์ (!) ์ด๋ ค ์์ผ๋ฉฐ ๋น์ทํ ๊ฒ์ ์ ์ํฉ๋๋ค. ์ ์ @buildcomplete ๋ ์์ ์ ์๋๋ฆฌ์ค์์ ์ ์ด๋ ํ ๋ฒ์ ์๋ @ gitjsdr26์ด ์ ์ํ ๊ฒ๊ณผ ๋์ผํ ์์
์
IFileDialog::SetDefaultFolder(...)
~ IFileDialog::SetFolder(...)
.
PR ์์ฑ์ ์๊ฐ์ ๋ญ๋นํ๊ณ ์ถ์ง ์์ต๋๋ค (์ด ๋จ์ผ ๋ผ์ธ๋ ๋ณ๊ฒฝํฉ๋๋ค).
@augustoproiete์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ์๋ ค์ฃผ์ธ์ :)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ง์ Windows ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ง์ง๋ง ๊ฒฝ๋ก๋ฅผ ๊ธฐ์ตํ๋ "์ค๋งํธ ํ"๊ธฐ๋ณธ ๋์์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ฌ์ค์ด์ง๋ง, ์ฑ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉ์๋ฅผ ๋๊ธฐ ์ํด ํน์ ์ด๊ธฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํน์ ํ๋ก์ ํธ ๊ด๋ จ ๋๋ ํ ๋ฆฌ์์๋ก๋ / ์ ์ฅํ ๊ฒ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์ ๊ฒฝ์ฐ ์ด๋ ๊ธฐ๋ณธ ๋์์ ๋๋ค. notepad / paint / word์์ "smart"๋ง์ง๋ง ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฑ ๊ฐ์๊ณ ์ธ๋ชจ๊ฐ ์์ต๋๋ค.
๊ฒ๋ค๊ฐ :
Microsoft.Win32.OpenFileDialog
๋ ๋๊ฐ์ ์์ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์์๋๋ก ์ฌ์ฉํฉ๋๋ค.