【題外話】
最近做了個.NET 4.0平台的程序,一直在Win7/8上運行的好好的,結果用戶說XP上說有問題,於是我就改了下程序,增加了記log的功能然後發給用戶。log的目錄是根據Environment.CurrentDirectory得出的。結果要求用戶運行完程序以後將log發回給我,但用戶始終找不到這個文件。
【文章索引】
【1、奇怪的目錄】
}
曾經從網上看到過一些介紹.NET中獲取當前目錄方法的文章,其中關於IO.Directory.GetCurrentDirectory()的描述基本上都是獲取程序的工作目錄,或者有的文章也說不清除獲取的是什麼。但對於Environment.CurrentDirectory獲取的內容,基本上都說是程序當前目錄,或者直接照搬MSDN上的說明。
其實這倆獲取到的是一樣的內容。而IO.Directory.GetCurrentDirectory()的代碼則如下所示:
StringBuilder sb = StringBuilder(Path.MAX_PATH + (Win32Native.GetCurrentDirectory(sb.Capacity, sb) == String currentDirectory = (currentDirectory.IndexOf() >= String demandPath = GetDemandDir(currentDirectory, FileIOPermission( FileIOPermissionAccess.PathDiscovery, String[] { demandPath }, , }
[DllImport(KERNEL32, SetLastError=, CharSet=CharSet.Auto, BestFitMapping= GetCurrentDirectory( nBufferLength, StringBuilder lpBuffer);
【2、奇怪的RestoreDirectory】
Form1_Load( .Text = String.Format( .chkRestoreDir.Checked = btnTest_Click( StringBuilder sb = sb.AppendLine(String.Format( sb.AppendLine(String.Format( sb.AppendLine(String.Format( sb.AppendLine(String.Format( .txtInfo.Text = chkRestoreDir_CheckedChanged( .dlgOpen.RestoreDirectory = }
【3、系統的問題】
CString info, path, T(), F( GetCurrentDirectory(, path.GetBuffer( info = info = info + info = info + + (chkRestoreDir.GetCheck() == TRUE ? CFileDialog * dlgOpen = CFileDialog(TRUE, (LPCTSTR), (LPCTSTR), OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | (chkRestoreDir.GetCheck() ? OFN_NOCHANGEDIR : ), (LPCTSTR) (dlgOpen->DoModal() == fileName = dlgOpen-> info = info + + GetCurrentDirectory(, path.GetBuffer( info = info + + InfoText = UpdateData();
【4、其他獲取方式】
(startupPath == StringBuilder sb = startupPath = Debug.WriteLineIf(IntSecurity.SecurityDemand.TraceVerbose, + startupPath + }
而其中的GetModuleFileName其實也是調用的WIN32 API,具體如下:
[DllImport(ExternDll.Kernel32, CharSet= GetModuleFileName(HandleRef hModule, StringBuilder buffer, length);
而GetModuleFileName其實是獲取執行程序的完整路徑,Application.StartupPath通過此獲取的目錄一定是程序所在的目錄。
【相關鏈接】