You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSIS中C#结合BouncyCastle实现PGP加密时URI非法字符异常问题

问题根源

你遇到的问题核心是**FileInfo构造函数不接受file:///格式的URI路径**,它需要的是本地文件系统的物理路径(比如C:\PubKeysSSIS\REDACTED\REDACTED.pubkey),而非URI格式字符串。

虽然Uri.TryCreate能验证file:///C:/...是合法URI,但PgpUtilities.WriteFileToLiteralData底层依赖FileInfo处理文件,file:///前缀和URI语境外的冒号会被判定为非法字符,因此抛出异常。

解决方案

方案1:将URI转换为本地物理路径

如果unencryptedData是URI格式字符串,先转为Uri对象,再通过LocalPath属性获取本地路径:

// 假设unencryptedData是file:///开头的URI字符串
Uri unencryptedFileUri;
if (!Uri.TryCreate(unencryptedData, UriKind.Absolute, out unencryptedFileUri) || !unencryptedFileUri.IsFile)
{
    throw new InvalidParameterException("Invalid file URI: " + unencryptedData);
}
// 获取本地物理路径
string localFilePath = unencryptedFileUri.LocalPath;

// 替换原代码中的FileInfo实例化部分
PgpUtilities.WriteFileToLiteralData(comData.Open(outStream), PgpLiteralData.Binary, new FileInfo(localFilePath));

方案2:直接使用本地文件路径

若无需URI格式,直接给unencryptedData赋值本地路径(用反斜杠或转义正斜杠):

// 直接用本地路径,不需要file:///前缀
string unencryptedData = @"C:\REDACTED\your-unencrypted-file.txt";
// 或者用转义正斜杠
// string unencryptedData = "C:/REDACTED/your-unencrypted-file.txt";

// 原代码中直接使用即可
PgpUtilities.WriteFileToLiteralData(comData.Open(outStream), PgpLiteralData.Binary, new FileInfo(unencryptedData));
补充说明
  • Uri.TryCreate仅验证URI格式合法性,不代表该字符串能被文件系统API识别。
  • 本地文件路径的合法格式为盘符+反斜杠(如C:\...)或正斜杠(如C:/...),不能带file:///前缀。

内容的提问来源于stack exchange,提问作者CDove

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:05:33