113 lines
3.5 KiB
C#
113 lines
3.5 KiB
C#
using IWshRuntimeLibrary;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Runtime.InteropServices;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace GeekDesk.Util
|
||
{
|
||
public class FileUtil
|
||
{
|
||
|
||
private static readonly string NO_PATH = ".*{.*}.*";
|
||
|
||
public static string GetTargetPathByLnk(string filePath)
|
||
{
|
||
try
|
||
{
|
||
WshShell shell = new WshShell();
|
||
IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(filePath);
|
||
|
||
if (StringUtil.IsEmpty(shortcut.TargetPath))
|
||
{
|
||
return null;
|
||
}
|
||
string path = shortcut.TargetPath;
|
||
if (path==null || Regex.IsMatch(path, NO_PATH))
|
||
{
|
||
path = ParseShortcut(filePath);
|
||
}
|
||
return path;
|
||
}
|
||
#pragma warning disable CS0168 // 声明了变量“e”,但从未使用过
|
||
catch (Exception e)
|
||
#pragma warning restore CS0168 // 声明了变量“e”,但从未使用过
|
||
{
|
||
LogUtil.WriteErrorLog(e, "获取文件图标失败! filePath=" + filePath);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
|
||
/*
|
||
UINT MsiGetShortcutTarget(
|
||
LPCTSTR szShortcutTarget,
|
||
LPTSTR szProductCode,
|
||
LPTSTR szFeatureId,
|
||
LPTSTR szComponentCode
|
||
);
|
||
*/
|
||
[DllImport("msi.dll", CharSet = CharSet.Auto)]
|
||
static extern int MsiGetShortcutTarget(string targetFile, StringBuilder productCode, StringBuilder featureID, StringBuilder componentCode);
|
||
|
||
public enum InstallState
|
||
{
|
||
NotUsed = -7,
|
||
BadConfig = -6,
|
||
Incomplete = -5,
|
||
SourceAbsent = -4,
|
||
MoreData = -3,
|
||
InvalidArg = -2,
|
||
Unknown = -1,
|
||
Broken = 0,
|
||
Advertised = 1,
|
||
Removed = 1,
|
||
Absent = 2,
|
||
Local = 3,
|
||
Source = 4,
|
||
Default = 5
|
||
}
|
||
|
||
public const int MaxFeatureLength = 38;
|
||
public const int MaxGuidLength = 38;
|
||
public const int MaxPathLength = 1024;
|
||
|
||
/*
|
||
INSTALLSTATE MsiGetComponentPath(
|
||
LPCTSTR szProduct,
|
||
LPCTSTR szComponent,
|
||
LPTSTR lpPathBuf,
|
||
DWORD* pcchBuf
|
||
);
|
||
*/
|
||
[DllImport("msi.dll", CharSet = CharSet.Auto)]
|
||
static extern InstallState MsiGetComponentPath(string productCode, string componentCode, StringBuilder componentPath, ref int componentPathBufferSize);
|
||
|
||
public static string ParseShortcut(string file)
|
||
{
|
||
StringBuilder product = new StringBuilder(MaxGuidLength + 1);
|
||
StringBuilder feature = new StringBuilder(MaxFeatureLength + 1);
|
||
StringBuilder component = new StringBuilder(MaxGuidLength + 1);
|
||
|
||
MsiGetShortcutTarget(file, product, feature, component);
|
||
|
||
int pathLength = MaxPathLength;
|
||
StringBuilder path = new StringBuilder(pathLength);
|
||
|
||
InstallState installState = MsiGetComponentPath(product.ToString(), component.ToString(), path, ref pathLength);
|
||
if (installState == InstallState.Local)
|
||
{
|
||
return path.ToString();
|
||
}
|
||
else
|
||
{
|
||
return null;
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|