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
相关产品推荐
相关产品推荐

