C# - 确定文件路径

时间:2016-01-08 13:32:07

标签: c# cursor monogame

我使用以下代码为程序加载自定义光标:

            var x = new XMLHttpRequest();
            x.onreadystatechange = function(){
            if(x.readyState == 4 && x.status == 200){
                alert("happyness");
            }
            };

            x.open("GET","servlet1",true);
            x.send();

然后:

public static Cursor LoadCustomCursor(string path)
{
    IntPtr hCurs = LoadCursorFromFile(path);
    if (hCurs == IntPtr.Zero) throw new Win32Exception(-2147467259, "Key game file missing. Please try re-installing the game to fix this error.");
    Cursor curs = new Cursor(hCurs);
    // Note: force the cursor to own the handle so it gets released properly.
    FieldInfo fi = typeof(Cursor).GetField("ownHandle", BindingFlags.NonPublic | BindingFlags.Instance);
    fi.SetValue(curs, true);
    return curs;
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern IntPtr LoadCursorFromFile(string path);

我想知道如果项目文件夹例如移动到D:/分区或C:/上的另一个文件夹,上面的绝对路径是否也可以工作?我可以这样做:

Cursor gameCursor = NativeMethods.LoadCustomCursor(@"C:/Users/User/Documents/Visual Studio 2015/Projects/myProj/myProj/Content/Graphics/Cursors/cursor_0.xnb");
Form gameForm = (Form)Control.FromHandle(Window.Handle);

使用string myStr = Assembly.GetExecutingAssembly().Location; string output = myStr.Replace("bin\\Windows\\Debug\\myProj.exe", "Content\\Graphics\\Cursors\\cursor_0.xnb"); 作为游标文件的路径? output是否为动态(每次移动程序文件夹时都会更改)?或者它始终与项目构建时相同?

3 个答案:

答案 0 :(得分:1)

您可以使用Environment.CurrentDirectory。例如:

string cursorPath = @"Content\Graphics\Cursors\cursor_0.xnb";
string output = Path.Combine(Environment.CurrentDirectory, cursorPath);

Environment.CurrentDirectory返回当前工作目录的完整路径,如果将它放在字符串前面,您可以使用@一次性转义文字\

答案 1 :(得分:0)

这种方法不是最好的方法。

最好使用相对路径,而不是绝对路径。

您可以使用" .."从当前位置向上移动一个文件夹。 例如

var output = @"..\..\..\Content\Graphics\Cursors\cursor_0.xnb";

等于

string myStr = System.Reflection.Assembly.GetExecutingAssembly().Location;
string output = myStr.Replace("bin\\Windows\\Debug\\myProj.exe", "Content\\Graphics\\Cursors\\cursor_0.xnb");

答案 2 :(得分:0)

只有当光标文件位于指定的确切路径时,您的绝对路径才会继续工作:@"C:/Users/User/Documents/Visual Studio 2015/Projects/myProj/myProj/Content/Graphics/Cursors/cursor_0.xnb"。将光标文件的位置与.EXE文件相关联是一个更好的主意,但是您需要维护在代码中指定的相对文件夹结构。您的代码现在依赖于生活在目录<appRoot>\bin\Windows\Debug中的.EXE,您在部署应用程序时可能不会想要它。 (相反,您可能会将.EXE放在应用程序的根文件夹中,资源文件会进入子目录。)对于这样的结构,您可以编写(代码从未编译过,因此可能包含拼写错误或其他错误):

var exe = Assembly.GetExecutingAssembly().Location;
var exeFolder = System.IO.Path.GetDirectoryName(exe);
var cursorFile = System.IO.Path.Combine(exeFolder, "relative/path/to/your.cur";

(为了增加好处,当重命名.EXE文件时,此代码将继续工作。) 使用这种方法,您只需要确保在相对于.EXE的特定位置找到光标文件。当然,开发盒和目标机器上都需要存在相同的结构。使用Visual Studio中的MSBuild任务将资源文件复制到$(OutDir)\relative\path\to。要部署到其他计算机,只需复制+粘贴输出文件夹的内容,或创建将文件部署到所需文件夹结构的安装程序。