2009-07-09 8 views
6

Làm thế nào để tôi biết đó là thư mục hiện tại của một ứng dụng? Ý tôi là ... Có cách nào để biết exe nằm ở đâu từ mã đang chạy không?Compact Framework Current Folder

cảm ơn trước

Trả lời

6
string fullAppName = Assembly.GetCallingAssembly().GetName().CodeBase; 
string fullAppPath = Path.GetDirectoryName(fullAppName); 
8

Windows Mobile không có khái niệm về thư mục hiện tại. "Thư mục hiện tại" về cơ bản luôn được đặt làm thư mục gốc của hệ thống tệp, bất kể vị trí của ứng dụng của bạn.

Để có được con đường ứng dụng của bạn có vị trí, bạn có thể sử dụng Assembly.GetExecutingAssembly(), và CodeBase tài sản hoặc GetName() phương pháp

4

Đừng chống lại hệ thống.

Microsoft không muốn bạn sử dụng thư mục tệp chương trình cho bất kỳ thứ gì khác sau đó tập hợp. Tập tin cấu hình nên đi trong dữ liệu ứng dụng, lưu các tập tin và những thứ mà người dùng cần biết về việc đi vào My Documents.

Câu trả lời của jalf sẽ hoạt động nhưng bạn đang chiến đấu với hệ thống. Trừ khi họ là một lý do thực sự tốt tại sao bạn muốn biết những gì thư mục lắp ráp của bạn là sau đó tôi sẽ đề nghị chống lại nó.

2

Bạn có thể sử dụng GetModuleFileName

Trong ví dụ dưới đây, phương pháp GetExecutablePath trả về vị trí của exe, và GetStartupPath trả về thư mục của exe.

using System; 
using System.ComponentModel; 
using System.IO; 
using System.Runtime.InteropServices; 
using System.Text; 

class Program 
{ 
    [DllImport("coredll", SetLastError = true)] 
    public static extern uint GetModuleFileName(IntPtr hModule, StringBuilder lpFilename, [MarshalAs(UnmanagedType.U4)] int nSize); 

    [DllImport("coredll")] 
    public static extern uint FormatMessage([MarshalAs(UnmanagedType.U4)] FormatMessageFlags dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, out IntPtr lpBuffer, uint nSize, IntPtr Arguments); 

    [DllImport("coredll")] 
    public static extern IntPtr LocalFree(IntPtr hMem); 

    [Flags] 
    internal enum FormatMessageFlags : uint 
    { 
     AllocateBuffer = 256, 
     FromSystem = 4096, 
     IgnoreInserts = 512 
    } 

    public static string GetModuleFileName(IntPtr hModule) 
    { 
     StringBuilder lpFilename = new StringBuilder(short.MaxValue); 
     uint num = GetModuleFileName(hModule, lpFilename, lpFilename.Capacity); 
     if (num == 0) 
     { 
      throw CreateWin32Exception(Marshal.GetLastWin32Error()); 
     } 
     return lpFilename.ToString(); 
    } 

    private static Win32Exception CreateWin32Exception(int error) 
    { 
     IntPtr buffer = IntPtr.Zero; 
     try 
     { 
      if (FormatMessage(FormatMessageFlags.IgnoreInserts | FormatMessageFlags.FromSystem | FormatMessageFlags.AllocateBuffer, IntPtr.Zero, (uint)error, 0, out buffer, 0, IntPtr.Zero) == 0) 
      { 
       return new Win32Exception(); 
      } 
      return new Win32Exception(error, Marshal.PtrToStringUni(buffer)); 
     } 
     finally 
     { 
      if (buffer != IntPtr.Zero) 
      { 
       LocalFree(buffer); 
      } 
     } 
    } 

    public static string GetStartupPath() 
    { 
     return Path.GetDirectoryName(GetExecutablePath()); 
    } 

    public static string GetExecutablePath() 
    { 
     return GetModuleFileName(IntPtr.Zero); 
    } 
} 
+0

Đó là một cái búa thực sự lớn cho móng tay nhỏ như vậy. – ctacke

2

Sau đây là đúng.

string fullAppName = Assembly.GetCallingAssembly().GetName().CodeBase; 
fullAppPath = Path.GetDirectoryName(fullAppName);
Đối với mã tương đương bằng các ngôn ngữ khác Tham khảo link