紧凑框架当前文件夹

时间:2009-07-09 21:02:17

标签: c# vb.net windows-mobile compact-framework

我怎么知道这是App的当前文件夹? 我的意思是......有没有办法知道exe在运行代码中的位置?

提前致谢

5 个答案:

答案 0 :(得分:8)

Windows Mobile没有当前文件夹的概念。无论您的应用程序位于何处,“当前文件夹”基本上始终设置为文件系统的根目录。

要获取应用程序所在的路径,您可以使用Assembly.GetExecutingAssembly()CodeBase属性或GetName()方法

答案 1 :(得分:6)

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

答案 2 :(得分:4)

不要打击系统。

Microsoft不希望您将程序文件文件夹用于除程序集之外的任何其他内容。配置文件应该放在用户需要知道的应用程序数据,保存文件等中,然后进入我的文档。

jalf的答案会奏效,但你正在与系统作斗争。除非他们想知道你的程序集所在的文件夹是一个非常好的理由,否则我建议不要这样做。

答案 3 :(得分:2)

您可以使用GetModuleFileName

在下面的示例中,方法GetExecutablePath返回exe的位置,GetStartupPath返回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);
    }
}

答案 4 :(得分:2)

以下是正确的。

string fullAppName = Assembly.GetCallingAssembly().GetName().CodeBase;
fullAppPath = Path.GetDirectoryName(fullAppName);
有关其他语言的等效代码,请参阅此link