我想获取当前目录路径,但不是应用程序位置,而是它的快捷方式位置。
我尝试了这些,但他们返回了应用程序的位置。
Directory.GetCurrentDirectory();
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
答案 0 :(得分:5)
如果添加COM对象引用不是问题,请添加COM对象引用 - Windows脚本宿主对象模型
我在我的桌面文件夹中运行此代码,它确实有效。对于当前文件夹使用 - Environment.CurrentDirectory
using System;
using System.IO;
using IWshRuntimeLibrary; //COM object -Windows Script Host Object Model
namespace csCon
{
class Program
{
static void Main(string[] args)
{
// Folder is set to Desktop
string dir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
var di = new DirectoryInfo(dir);
FileInfo[] fis = di.GetFiles();
if (fis.Length > 0)
{
foreach (FileInfo fi in fis)
{
if (fi.FullName.EndsWith("lnk"))
{
IWshShell shell = new WshShell();
var lnk = shell.CreateShortcut(fi.FullName) as IWshShortcut;
if (lnk != null)
{
Console.WriteLine("Link name: {0}", lnk.FullName);
Console.WriteLine("link target: {0}", lnk.TargetPath);
Console.WriteLine("link working: {0}", lnk.WorkingDirectory);
Console.WriteLine("description: {0}", lnk.Description);
}
}
}
}
}
}
}
论坛代码参考:http://www.neowin.net/forum/topic/658928-c%23-resolve-lnk-files/
答案 1 :(得分:4)
根据MSDN中的进程API引用,给定进程的进程STARTUPINFO
结构包含有关标题成员中的快捷方式.lnk文件的信息。在dwFlags
结构成员中存在一个标志,在这种情况下设置 - 因此看起来并不总是设置(我猜你是否直接运行了exe)
来自MSDN:
STARTF_TITLEISLINKNAME:0x00000800
lpTitle成员包含用户调用的快捷方式文件(.lnk)的路径 开始这个过程。当.lnk文件指向时,这通常由shell设置 调用启动的应用程序。大多数应用程序不需要设置此值。 此标志不能与STARTF_TITLEISAPPID一起使用。
答案 2 :(得分:1)
答案 3 :(得分:1)
我认为您需要使用COM并添加对“Microsoft Shell Control And Automation”的引用,如this博文中所述:
以下是使用此处提供的代码的示例:
namespace Shortcut
{
using System;
using System.Diagnostics;
using System.IO;
using Shell32;
class Program
{
public static string GetShortcutTargetFile(string shortcutFilename)
{
string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename);
string filenameOnly = System.IO.Path.GetFileName(shortcutFilename);
Shell shell = new Shell();
Folder folder = shell.NameSpace(pathOnly);
FolderItem folderItem = folder.ParseName(filenameOnly);
if (folderItem != null)
{
Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink;
return link.Path;
}
return string.Empty;
}
static void Main(string[] args)
{
const string path = @"C:\link to foobar.lnk";
Console.WriteLine(GetShortcutTargetFile(path));
}
}
}
答案 4 :(得分:0)
使用System.Reflection;
string currentAssemblyDirectoryName = Path.GetDirectoryName(
Assembly.GetExecutingAssembly()
.Location
);
对于Web应用程序,您可以使用:
网络应用程序:
Request.PhysicalApplicationPath
http://msdn.microsoft.com/en-us/library/system.web.httprequest.physicalapplicationpath.aspx
绘制应用程序路径图:)
答案 5 :(得分:0)
由于创建快捷方式是工作流程的一部分,因此只需将工作目录设置为"%cd%"然后,在应用程序中,使用:
Environment.CurrentDirectory
显然,您希望在应用程序调用的任何代码可以更改之前捕获此值。
使用Windows资源管理器创建快捷方式时,您无法设置工作目录。因此,在创建它之后,通过右键单击它并选择“属性”来打开其属性页面,然后将开始于字段设置为%cd%
。创建此类快捷方式后,您可以将其移动或复制到您希望应用程序运行的文件夹中。
答案 6 :(得分:0)
您可以将文件作为常规文本文件打开,以\x00
0个字符分割,然后检查结果字符串数组。其中一个显然是链接目标:类似"C:\path\to\file"
或UNC "\\computers\path\to\file"
的情况。
string lnkFilePath "...";
var file = System.IO.File.ReadAllText(lnkFilePath);
var contents = Regex.Split(file, "[\x00]+");
var paths = contents.Where(line => Regex.IsMatch(line, @"^([A-Z]:\\|^\\\\)\S+.*?"));