我试图获取infopath 2007附件文件的名称(在xml中,默认情况下在base64Binary中编码),我之前用相同的代码实现了这个,但由于某种原因我无法获得原始文件名,我现在使用的xml文件中的附件(我需要找到附件的.extension,文件也需要与之前的名称相同),但如果我手动编写文件扩展名,我可以导出文件,所以我的问题是:为什么我能成功地从base64字符串中写入文件,而且我无法得到它的名字
备注:
decodeFromBase64
正常工作getFileName
致力于不同的包装工作。我之前使用的xml,据我所知,没有任何相关的差异,因为我能够获得编码的字符串并解码文件编写文件的代码(有效):
public static void decodeFromBase64(string encodedString)
{
using (FileStream stream = System.IO.File.Create("D:\\some dir\\file.png"))
{
byte[] byteArray = Convert.FromBase64String(file);
stream.Write(byteArray, 0, byteArray.Length);
}
}
获取文件名的代码,抛出:' System.ArgumentOutOfRangeException'的这里: / ********************************************** /
byte[] _fileNameBytes = _theReader.ReadBytes(_attachmentNameLength);
/ ********************************************** /
public static string getFileName(string attachedFile)
{
string fname;
byte[] thdata = Convert.FromBase64String(attachedFile);
Encoding _encoding = Encoding.Unicode;
using (MemoryStream _memoryStream = new MemoryStream(thdata))
{
BinaryReader _theReader = new BinaryReader(_memoryStream);
_theReader.BaseStream.Position = 0;
byte[] _headerData = _theReader.ReadBytes(16);
int _fileSize = (int)_theReader.ReadUInt32();
int _attachmentNameLength = (int)_theReader.ReadUInt32() * 2;
byte[] _fileNameBytes = _theReader.ReadBytes(_attachmentNameLength);
fname = _encoding.GetString(_fileNameBytes, 0, _attachmentNameLength - 2);
if (fname.Length > 0)
return fname;
}
return fname;
}
修改
EDIT2:
##############################已解决################ #################
即使我发现解决方案我不确定问题的确切来源。我的编码字符串的完整性在某种程度上被破坏了(不知怎的,我搞砸了我的测试模板的构造,在测试附件所在的xml文件之后,一切都变得很棒 ALSO 唯一的编码字符串不起作用的文件到目前为止是我自己的,考虑到我之前从未使用过infopath,这是完全合理的)
供将来参考:这里是官方解码器和编码器类