我正在注册表中查询服务的 ImagePath。返回的是:
"C:\Program Files\App\App.exe"
我在注册表函数中转换该 ToString,结果是:
"\"C:\\Program Files (x86)\\App\App.exe\""
然后我需要创建一个
FileInfo
对象,但由于非法字符而失败。
如何将字符串剥离回“C:\Program Files (x86)\App\App.exe”,这样我就可以在我的
FileInfo
初始化中简单地声明@string。
简单的答案是首先不要将其转换为字符串,但这会改变我广泛使用的辅助函数的行为。
代码:
public static String getRegistryKeyValue(RegistryHive hiveType, String key, String value)
{
RegistryKey registryKey;
if (Environment.Is64BitOperatingSystem == true)
registryKey = RegistryKey.OpenBaseKey(hiveType, RegistryView.Registry64);
else
registryKey = RegistryKey.OpenBaseKey(hiveType, RegistryView.Registry32);
RegistryKey keyToRead = registryKey.OpenSubKey(key);
String data = "";
try
{
data = keyToRead.GetValue(value).ToString();
}
catch (Exception)
{
logger.Error("Unable to get key: " + key + " for value: " + value);
}
logger.Info("Getting registry data for: " + key + " with value: " + value + " is: " + data);
return data;
}
当我调用该方法并初始化 DirectoryInfo 时,它会抛出异常“路径中存在非法字符”。使用 @ 或不使用 @ 都会导致相同的异常。
DirectoryInfo exe = new DirectoryInfo(@exePath);
我使用以下方法从文件路径中删除不安全字符。
public static string RemoveIllegalFilenameCharactersFrom(string unsafeString)
{
const string illegalCharactersClass = @"[\&\<\>\:/|" + "\"" + @"\?\*]";
string replaced = Regex.Replace(unsafeString, illegalCharactersClass, "");
return replaced;
}
如果它确实像你说的那样生成不安全的字符串,除了通过删除不安全字符来修改字符串之外,我看不到任何其他方法。
value = value.Substring(1, value.Length - 2);
这个问题已经解决了,我只需要删除 value.Trim('\"') 的引号即可。
"\"C:\\Program Files (x86)\\App\\App.exe\""
是以下逐字字符串值的常规 C# 字符串文字表示,包括封闭的"
字符。:"C:\Program Files (x86)\App\App.exe"
等效的逐字字符串文字表示是:
@"""C:\Program Files (x86)\App\App.exe"""
@
前缀仅适用于字符串文字;它可以不按照您尝试的方式应用变量。要将此类字符串识别为文件路径,包含 "
字符的
embedded。必须删除, 您可以使用
.Trim('"')
来做到这一点
// -> The following *verbatim value*:
// C:\Program Files (x86)\App\App.exe
"\"C:\\Program Files (x86)\\App\\App.exe\"".Trim('"')
.Trim('"')
从给定字符串值的两端删除(任何非空的)
"
字符。