ReadAllText只返回第一行

时间:2015-09-09 16:43:16

标签: php vb.net

我试图用VB.net复制这个PHP函数:

function getGiantsModMD5Hash($modFile)
{
$info = pathinfo($modFile);
// Add mod zip data
$fileContent = file_get_contents($modFile);
// Add basefile name string without extension
$fileContent .= basename($modFile, '.' . $info['extension']);
return md5($fileContent);
}

根据我的理解,函数FileSystem.ReadAllText最相当于PHP中的file_get_contents函数。但是当我使用它时它不起作用,它似乎只返回第一行。我尝试过添加Encoding.Default,Encoding.UTF8等等,似乎都没有。

这是我的阅读文件的代码(在这种情况下,它是.zip文件)

Dim createHash As String
createHash = My.Computer.FileSystem.ReadAllText(modsPath & modName & ".zip") & modName
Form1.TextBox1.Text = createHash                ' Show result of ReadAllText to my eye

我知道如何才能让它发挥作用?

更新

这是"格式"我需要的数据:

PKHr�F���Q��U   brand.dds훻    
�1�W�4���o`ao�al��ZX��C|@��-A��)���b��:d�39's�hVQ9�G&�ɹ��3��]�q��j�:{����     
�S�������a�e���ߵ[7����]�

......等等

这就是我打印PHP file_get_contents函数的结果时的样子。 (文件是.zip)

我需要做的是获取该信息并添加没有文件扩展名的文件名并计算MD5哈希值,因此我可以将该值与已存在的MD5哈希值进行比较。

我已经谷歌搜索了几个小时,现在大声寻找任何解决方案。使用PHP看起来如此简单但看起来几乎不可能用VB.NET复制? :(

1 个答案:

答案 0 :(得分:1)

zip文件不是文本文件,因此请勿尝试使用它。区分文本数据和二进制数据至关重要 - 不仅仅是在这里,而是在所有地方。

散列文件很简单。不幸的是,当您添加文件名时会使事情稍微复杂一点,但它并不太糟糕。这里是C#代码,希望你能够轻松地移植到VB(你将使用完全相同的方法和类型):

byte[] HashFileWithName(string filename)
{
    using (var md5 = Md5.Create())
    {
        using (var stream = File.OpenRead(filename))
        {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = stream.Read(buffer, 0, 1024)) != 0)
            {
                md5.TransformBlock(buffer, 0, bytesRead, null, 0);
            }
            string nameToHash = Path.GetFileNameWithoutExtension(filename);
            md5.TransformFinalBlock(Encoding.UTF8.GetBytes(nameToHash));
            return md5.Hash;
        }
    }
}

您可能需要调整文件名的编码,尽管除非文件名包含非ASCII字符,否则它不太重要。