C# 将文件流长度强制转换为int
我有一个关于从long到int转换的安全性的问题。我担心我写的方法可能会在这个转换中失败。你能看一下下面的代码并告诉我是否有可能写一些可以避免失败的东西吗 先谢谢你C# 将文件流长度强制转换为int,c#,casting,filestream,C#,Casting,Filestream,我有一个关于从long到int转换的安全性的问题。我担心我写的方法可能会在这个转换中失败。你能看一下下面的代码并告诉我是否有可能写一些可以避免失败的东西吗 先谢谢你 public static string ReadDecrypted(string fileFullPath) { string result = string.Empty; using (FileStream fs = new FileStream(fileFullPath, Fi
public static string ReadDecrypted(string fileFullPath)
{
string result = string.Empty;
using (FileStream fs = new FileStream(fileFullPath, FileMode.Open, FileAccess.Read))
{
int fsLength = (int)fs.Length;
byte[] decrypted;
byte[] read = new byte[fsLength];
if (fs.CanRead)
{
fs.Read(read, 0, fsLength);
decrypted = ProtectedData.Unprotect(read, CreateEntropy(), DataProtectionScope.CurrentUser);
result = Utils.AppDefaultEncoding.GetString(decrypted, 0, decrypted.Length);
}
}
return result;
}
嗯,
int
是32位的,long
是64位的,所以如果打开2GB文件,总是有可能丢失一些数据;另一方面,一个fsLength
字节数组的分配似乎表明您不希望文件那么大。签入以确保fs.Length
不大于2147483647,您应该没事。好吧,int
是32位,long
是64位,因此如果您打开2GB文件,cast总是有可能丢失一些数据;另一方面,一个fsLength
字节数组的分配似乎表明您不希望文件那么大。签入以确保fs.Length
不大于2147483647,您应该不会有问题。简短的回答是:是的,这样,任何长度>=2 GB的文件都会出现问题
如果您不希望有那么大的文件,则可以直接在using块的开头插入:
if (((int)fs.Length) != fs.Length) throw new Exception ("too big");
否则您不应该强制转换为int,而是更改byte[]read=newbyte[fsLength]代码>
tobyte[]read=新字节[fs.Length]
并使用循环以“块”的形式读取文件内容,每个块的最大值为2 GB
另一种选择(在.NET4中提供)是使用MemoryMappedFile(请参阅)-这样您根本不需要调用Read:-)简短的回答是:是的,这样您将遇到任何长度>=2 GB的文件的问题
如果您不希望有那么大的文件,则可以直接在using块的开头插入:
if (((int)fs.Length) != fs.Length) throw new Exception ("too big");
否则您不应该强制转换为int,而是更改byte[]read=newbyte[fsLength]代码>
tobyte[]read=新字节[fs.Length]
并使用循环以“块”的形式读取文件内容,每个块的最大值为2 GB
另一种选择(在.NET4中提供)是使用MemoryMappedFile(请参阅)-这样您根本不需要调用Read:-)为什么不将fsLength声明为long并避免强制转换?我不是C#方面的专家,但假设fs.Length
等于2的31次方(1)您也可以质疑将两公升瓶子的内容物倒入一公升瓶子的安全性,而不检查源瓶子是否超过一半。最终结果大致相同。@Yahia-很抱歉,我最初不清楚,我是因为filestream.Read()需要int作为最后一个参数,而不是long@Tod-因为我不能用长参数调用filestream.Read(),为什么不将fsLength声明为long并避免强制转换?我不是C#方面的专家,但假设fs.Length
等于2的31次方(1)您也可以质疑将两公升瓶子的内容物倒入一公升瓶子的安全性,而不检查源瓶子是否超过一半。最终结果大致相同。@Yahia-很抱歉,我最初不清楚,我是因为filestream.Read()需要int作为最后一个参数,而不是long@Tod-因为我不能用长参数调用filestream.Read(),谢谢你的回答;我知道如果我希望得到更大的文件,我应该避免使用强制转换。我怎么能在这么大的文件上调用filestream.Read(),你能提供一个提示吗?你可以直接调用filestream.Read(),只是不要一次读取整个文件;读取一个块,处理该块,然后读取下一个块。谢谢你的回答;我理解如果我希望看到更大的文件,我应该避免使用强制转换。我如何才能对如此大的文件调用filestream.read(),你能提供一个提示吗?你可以调用filestream.read(),只是不要一次读取整个文件;读取一个块,处理该块,然后读取下一个块。