C# - 确定文件路径
本文关键字:文件 路径 | 更新日期: 2023-09-27 18:29:27
我使用以下代码为我的程序加载自定义光标:
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);
然后:
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);
我想知道如果例如将项目文件夹移动到 D:/,上面的绝对路径是否也有效分区或 C:/上的另一个文件夹?我可以做这样的事情吗:
string myStr = Assembly.GetExecutingAssembly().Location;
string output = myStr.Replace("bin''Windows''Debug''myProj.exe", "Content''Graphics''Cursors''cursor_0.xnb");
并使用output
作为光标文件的路径?Assembly.GetExecutingAssembly().Location
动态的(每次移动程序文件夹时都会更改(?还是总是与项目构建时相同?
Environment.CurrentDirectory
.例:
string cursorPath = @"Content'Graphics'Cursors'cursor_0.xnb";
string output = Path.Combine(Environment.CurrentDirectory, cursorPath);
Environment.CurrentDirectory 返回当前工作目录的完整路径,如果将文本'
放在字符串前面,则可以使用 @
一次转义所有文本。
这种方法不是最好的方法。
最好使用相对路径,而不是绝对路径。
您可以使用".."将一个文件夹从当前位置上移。例如
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");
只有当光标文件位于指定的确切路径时,您的绝对路径才会继续工作:@"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
。若要部署到其他计算机,只需复制+粘贴输出文件夹的内容,或创建将文件部署到所需文件夹结构的安装程序。