没有显示哈希输出

杰森·彭

知名会员
已加入
2019年8月13日
留言内容
46
编程经验
Beginner
我目前正在使用C#执行重复数据删除程序,到目前为止,我已经能够上传,下载,选择和删除文件。但是,我想在我的应用程序表中生成文件的哈希值。但是,没有显示任何哈希,因此我不确定是否正确执行了哈希代码。我只想显示MD5列中文件的MD5哈希。
C#:
using Google.Apis.Auth.OAuth2;
using Google.Apis.Download;
using Google.Apis.Drive.v3;
using Google.Apis.Services;
using Google.Apis.Util.Store;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Web;
using System.Security.Cryptography;

namespace GoogleDriveRestApi_v3.Models
{
    public class GoogleDriveFilesRepository
    {
        public static string[] Scopes = { DriveService.Scope.Drive };

        //create Drive API service.
        public static DriveService GetService()
        {
            //get Credentials from client_secret.json file
            UserCredential credential;
            using (var stream = new FileStream(@"D:\client_secret.json", FileMode.Open, FileAccess.Read))
            {
                String FolderPath = @"D:\";
                String FilePath = Path.Combine(FolderPath, "DriveServiceCredentials.json");

                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    Scopes,
                    "user",
                   能够cellationToken.None,
                    new FileDataStore(FilePath, true)).Result;
            }

            //create Drive API service.
            DriveService service = new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "GoogleDriveRestAPI-v3",
            });
            return service;
        }

        //get all files from Google Drive.
        public static 清单<GoogleDriveFiles> GetDriveFiles()
        {
            DriveService service = GetService();

            // define parameters of request.
            FilesResource.ListRequest FileListRequest = service.Files.List();

            //listRequest.PageSize = 10;
            //listRequest.PageToken = 10;
            FileListRequest.Fields = "nextPageToken, files(id, name, size, version, createdTime)";

            //get file list.
            IList<Google.Apis.Drive.v3.Data.File> files = FileListRequest.Execute().Files;
            清单<GoogleDriveFiles> FileList = new 清单<GoogleDriveFiles>();

            if (files != null && files.Count > 0)
            {
                foreach (var file in files)
                {
                    GoogleDriveFiles File = new GoogleDriveFiles
                    {
                        Id = file.Id,
                        Name = file.Name,
                        Size = file.Size,
                        Version = file.Version,
                        CreatedTime = file.CreatedTime,
                        HashFiles = file.Md5Checksum,
                        // HashFile = file.Md5Checksum,
                    };
                    FileList.Add(File);
                }
            }
            return FileList;
        }

        //Get Hash Value

        public static void GenerateHash(HttpPostedFileBase file)
        {
            string directory = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"),
                Path.GetFileName(file.FileName));

            using (var md5 = MD5.Create())
            {
                using (var stream = File.OpenRead(directory))
                {
                    var hash = md5.ComputeHash(stream);
                    var data = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();

                }
            }

        }

        //file Upload to the Google Drive.
        public static void FileUpload(HttpPostedFileBase file)
        {
            if (file != null && file.ContentLength > 0)
            {
                DriveService service = GetService();

                string path = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"),
                Path.GetFileName(file.FileName));
                file.SaveAs(path);

                var FileMetaData = new Google.Apis.Drive.v3.Data.File();
                FileMetaData.Name = Path.GetFileName(file.FileName);
                FileMetaData.MimeType = MimeMapping.GetMimeMapping(path);

                FilesResource.CreateMediaUpload request;

                using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open))
                {
                    request = service.Files.Create(FileMetaData, stream, FileMetaData.MimeType);
                    request.Fields = "id";
                    request.Upload();
                }
            }
        }

        //Download file from Google Drive by fileId.
        public static string DownloadGoogleFile(string fileId)
        {
            DriveService service = GetService();

            string FolderPath = System.Web.HttpContext.Current.Server.MapPath("/GoogleDriveFiles/");
            FilesResource.GetRequest request = service.Files.Get(fileId);

            string FileName = request.Execute().Name;
            string FilePath = System.IO.Path.Combine(FolderPath, FileName);

            MemoryStream stream1 = new MemoryStream();

            // Add a handler which will be notified on progress changes.
            // It will notify on each chunk download and when the
            // download is completed or failed.
            request.MediaDownloader.ProgressChanged += (Google.Apis.Download.IDownloadProgress progress) =>
            {
                switch (progress.Status)
                {
                    case DownloadStatus.Downloading:
                        {
                            Console.WriteLine(progress.BytesDownloaded);
                            break;
                        }
                    case DownloadStatus.Completed:
                        {
                            Console.WriteLine("Download complete.");
                            SaveStream(stream1, FilePath);
                            break;
                        }
                    case DownloadStatus.Failed:
                        {
                            Console.WriteLine("Download failed.");
                            break;
                        }
                }
            };
            request.Download(stream1);
            return FilePath;
        }

        // file save to server path
        private static void SaveStream(MemoryStream stream, string FilePath)
        {
            using (System.IO.FileStream file = new FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite))
            {
                stream.WriteTo(file);
            }
        }

        //Delete file from the Google drive
        public static void DeleteFile(GoogleDriveFiles files)
        {
            DriveService service = GetService();
            try
            {
                // Initial validation.
                if (service == null)
                    throw new ArgumentNullException("service");

                if (files == null)
                    throw new ArgumentNullException(files.Id);

                // Make the request.
                service.Files.Delete(files.Id).Execute();
            }
            catch (Exception ex)
            {
                throw new Exception("Request Files.Delete failed.", ex);
            }
        }
    }
}
 
由主持人最后编辑:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,480
位置
悉尼,澳大利亚
编程经验
10+
发布您拥有的每一行代码是怎么回事?您只需要发布相关代码。您还需要调试代码,即设置一个断点并逐行逐步检查它并在运行时检查状态。然后,您可以确切地告诉我们实际行为与您的预期有何不同。发布大量的代码并希望我们深入研究它以找到相关的部分并确定其实际应做的工作,这期望值很高。我们在这里为您提供帮助,但您需要尽最大努力来帮助我们做到这一点。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,901
位置
英国
编程经验
10+
我也不是全部。大声笑
我们也有事要做。最好将您怀疑的代码或您想向我们询问的代码发布出来。考虑到最近我不得不花很少的时间,我不准备这样做,希望在那里打乱整个命名空间。您需要为我们简化和缩小它。因此,我给您一个使用md5hash的快速示例:
C#:
        private string Xfile => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "CFile.txt");
        private void Button1_Click(object sender, EventArgs e)
        {
            var FilePath = Path.GetFullPath(Xfile);
            Console.WriteLine($"FilePath returns '{FilePath}' which when passed to the GetMD5 will be the actual path of the file, which you need.");
            var getmd5return = GetMD5(FilePath);
            /* You can use bit converter to convert it to hex */
            var getasstring = bitCon(getmd5return);
            Console.WriteLine($"The md5 returns type {getmd5return} as {getmd5return.Length} chars \nAnd the bitconvert returns a hex representation as string {getasstring}");
        }
        private byte[] GetMD5(string file)
        {
            using (var md5 = MD5.Create())
            {
                using (var data = File.OpenRead(file))
                {
                   byte[] mdsum = md5.ComputeHash(data); /* Computes the hash from the file */
                    Console.WriteLine($"Computes the hash from the file to {mdsum.Length} bytes");
                    return mdsum; /* This will return 16 bytes */
                }
            }
        }
        private string bitCon(byte[] hash)
        {
             return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); /* This will return a string representation in hex */
        }
Coneole output:
GetFileName returns 'C:\Users\user\Desktop\CFile.txt' which when passed to the GetMD5 will be the actual path of the file, which you need.
Computes the hash from the file to 16 bytes
The md5 returns type System.Byte[] as 16 chars
And the bitconvert returns a hex representation as string c1b2469efa04bc14fa3cb808bcb8a78a
如果您需要更多信息,这里有一个完整的文档部分供您大饱眼福: MD5类(System.Security.Cryptography)

如果这还不够,请针对代码的特定部分提出具体问题,而该部分没有达到预期的效果。
Simpler version:
        private string Xfile => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "CFile.txt");
        private void Button1_Click(object sender, EventArgs e)
        {
            string FilePath = Path.GetFullPath(Xfile);
            Console.WriteLine($"FilePath returns '{FilePath}' which when passed to the GetMD5 will be the actual path of the file, which you need.");
            byte[] getmd5return = GetMD5(FilePath);
            /* You can use bit converter to convert it to hex */
            string getasstring = bitCon(getmd5return);
            Console.WriteLine($"The md5 returns type {getmd5return} as {getmd5return.Length} chars \nAnd the bitconvert returns a hex representation as string {getasstring}");
        }
        private byte[] GetMD5(string file)
        {
            using (MD5 md5 = MD5.Create())
            {
                using (FileStream data = File.OpenRead(file))
                {
                   byte[] mdsum = md5.ComputeHash(data); /* Computes the hash from the file */
                    Console.WriteLine($"Computes the hash from the file to {mdsum.Length} bytes");
                    return mdsum; /* This will return 16 bytes */
                }
            }
        }
        private string bitCon(byte[] hash)
        {
             return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); /* This will return a string representation in hex */
        }
编辑出错字
 
Last edited:

杰森·彭

知名会员
已加入
2019年8月13日
留言内容
46
编程经验
Beginner
好的,对篇幅过长表示歉意。我将在这里解决问题。首先,我没有显示要为Google云端硬盘中的文件生成的哈希,因此我不确定是否是因为哈希代码问题。

哈希类(要在Google驱动器中生成文件的MD5哈希):
 //Get Hash Value

        public static void GenerateHash(HttpPostedFileBase file)
        {
            string directory = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"),
                Path.GetFileName(file.FileName));

            using (var md5 = MD5.Create())
            {
                using (var stream = File.OpenRead(directory))
                {
                    var hash = md5.ComputeHash(stream);
                    var data = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();

                }
            }

        }

但是我不确定如何将哈希代码链接到将显示输出的.cshtml文件。

GetGoogleDrive.cshtml:
  <table class="table" border="1">
        <tr id="header">
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Size)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Version)
            </th>

            <th>
                @Html.DisplayNameFor(model => model.CreatedTime)
            </th>

            <th>
                @Html.DisplayNameFor(model => model.md5Checksum)
            </th>

这属于我的应用程序的主要模型类

Main model:
public class GoogleDriveFiles
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public long? Size { get; set; }
        public long? Version { get; set; }
        public DateTime? CreatedTime { get; set; }
       public string md5Checksum { get; set; }

    }

哈希错误


这是我的主要问题,因为我不确定我做的哈希码是否必要。根据我最常看到的哈希码,基本上是从代码中获取我们设置的文件的哈希。我试图实现的目的是获取驱动器中文件的哈希值。

表格.PNG


我只希望能够在该列中显示哈希,以便我知道自己能够在Google驱动器中生成这些文件的哈希。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,901
位置
英国
编程经验
10+
据我了解,Google.Apis.Drive.v3.Data.File列表将仅返回元数据,而不是实际文件,并且不像在PC上迭代文件那样。如果要从返回的元数据响应中获取文件,则需要获取该文件的ID,然后调用以通过api下载该文件并将其读入内存,最好从 webclient下载文件。您需要先下载文件,然后才能对她使用md5魔术。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,901
位置
英国
编程经验
10+
例如,这是检查我的驱动器空间时减去我的IDS过滤等后我的帐户收益的结果
C#:
{
 "kind": "drive#fileList",
 "incompleteSearch": false,
 "files": [
  {
   "kind": "drive#file",
   "id": "1-ny8************h1Bek",
   "name": "Long-term Assistance",
   "mimeType": "application/vnd.google-apps.document"
  },
  {
   "kind": "drive#file",
   "id": "16ff************BhYD",
   "name": "Php************.rar",
   "mimeType": "application/rar"
  }
 ]
}
 

杰森·彭

知名会员
已加入
2019年8月13日
留言内容
46
编程经验
Beginner
好的,因此我设法按需获取文件的哈希值。
Code for hash md5:
  public static 清单<GoogleDriveFiles> GetDriveFiles()
        {
            DriveService service = GetService();

            // define parameters of request.
            FilesResource.ListRequest FileListRequest = service.Files.List();

            //listRequest.PageSize = 10;
            //listRequest.PageToken = 10;
            FileListRequest.Fields = "nextPageToken, files(id, name, size, createdTime, md5Checksum)";

            //get file list.
            IList<Google.Apis.Drive.v3.Data.File> files = FileListRequest.Execute().Files;
            清单<GoogleDriveFiles> FileList = new 清单<GoogleDriveFiles>();

            //get hash


            if (files != null && files.Count > 0)
            {
                foreach (var file in files)
                {
                    GoogleDriveFiles File = new GoogleDriveFiles
                    {
                        Id = file.Id,
                        Name = file.Name,
                        Size = file.Size,
                        CreatedTime = file.CreatedTime,
                        MD5hash = file.Md5Checksum,

                };
                    FileList.Add(File);
                  
                }
            }
            return FileList;



        }

现在,我想像哈希集一样插入文件的那些哈希值。我试图在返回文件列表下声明哈希集,然后将MD5hash添加到哈希集中,但不允许这样做。我应该声明另一个哈希集函数,还是可以在与上述相同的代码块中调用它,
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,901
位置
英国
编程经验
10+
你是怎么得到哈希的?
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,901
位置
英国
编程经验
10+
好的,没关系,我在错觉v2 API下停止提供MD5总和,但这仅适用于gdocs。我懂了 你是怎么做到的 使用 列出API.

返回您的元数据,对其进行加密并使用 哈希表 将md5添加到。
 

杰森·彭

知名会员
已加入
2019年8月13日
留言内容
46
编程经验
Beginner
该哈希表将包含密钥对及其值。因此,对于我而言,密钥对将是文件名,而值将是哈希?这个哈希表应该在此代码块中吗?

从Google云端硬盘获取文件列表:
 //get file list.
            IList<Google.Apis.Drive.v3.Data.File> files = FileListRequest.Execute().Files;
            清单<GoogleDriveFiles> FileList = new 清单<GoogleDriveFiles>();

            if (files != null && files.Count > 0)
            {
                foreach (var file in files)
                {
                    GoogleDriveFiles File = new GoogleDriveFiles
                    {
                        Id = file.Id,
                        Name = file.Name,
                        Size = file.Size,
                        CreatedTime = file.CreatedTime,
                        MD5hash = file.Md5Checksum,

                };
                    FileList.Add(File);

                    
                }
            }
            return FileList;

        }

还是我应该放在这里?
将文件上传到Google驱动器:
        //file Upload to the Google Drive.
        public static void FileUpload(HttpPostedFileBase file)
        {
            if (file != null && file.ContentLength > 0)
            {
                DriveService service = GetService();

                string path = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"),
                Path.GetFileName(file.FileName));
                file.SaveAs(path);

                var FileMetaData = new Google.Apis.Drive.v3.Data.File();
                FileMetaData.Name = Path.GetFileName(file.FileName);
                FileMetaData.MimeType = MimeMapping.GetMimeMapping(path);

                FilesResource.CreateMediaUpload request;

                  using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open))
                {
                    request = service.Files.Create(FileMetaData, stream, FileMetaData.MimeType);
                    request.Fields = "id";
                    request.Upload();
                }
            }
        }

我不确定该哈希表应该放在哪个块中。还是我应该像新功能一样构建?
 

杰森·彭

知名会员
已加入
2019年8月13日
留言内容
46
编程经验
Beginner
Hashtable:
//get file list.
            IList<Google.Apis.Drive.v3.Data.File> files = FileListRequest.Execute().Files;
            清单<GoogleDriveFiles> FileList = new 清单<GoogleDriveFiles>();

            if (files != null && files.Count > 0)
            {
                foreach (var file in files)
                {
                    GoogleDriveFiles File = new GoogleDriveFiles
                    {
                        Id = file.Id,
                        Name = file.Name,
                        Size = file.Size,
                        CreatedTime = file.CreatedTime,
                        MD5hash = file.Md5Checksum,

                };
                    FileList.Add(File);

                    Hashtable HashedFiles = new Hashtable();
                    HashedFiles.Add(file.Id, file.Md5Checksum);
                    
                }
            }
            return FileList;

        }

做哈希表的方式是这样的吗?如果是这样,基于该哈希表,是否可以删除具有相同哈希值的文件?
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,901
位置
英国
编程经验
10+
密钥将是校验和而不是文件。切换它们。密钥将是唯一的(MD5),我认为如果以后需要从表中获取文件名,则能够引用文件名会更好,因此哈希表适合这种用法。

Since you are uploading the files I would extend this public static void FileUpload(HttpPostedFileBase file) to include an extra parameter to be passed in, which would be your whole hash table. Or make a static 哈希表 property/field you can return where you need it. Since it would be static, you could do this from any part of your application.
 
Last edited:

杰森·彭

知名会员
已加入
2019年8月13日
留言内容
46
编程经验
Beginner
哈希表应该插入哪个块中?上传文件还是检索文件列表?根据您的声明,应该在上传文件中插入一个额外的参数,我相信哈希表应该像这样吗?

Hashtable:
 if (files != null && files.Count > 0)
            {
                foreach (var file in files)
                {
                    GoogleDriveFiles File = new GoogleDriveFiles
                    {
                        Id = file.Id,
                        Name = file.Name,
                        Size = file.Size,
                        CreatedTime = file.CreatedTime,
                        MD5hash = file.Md5Checksum,

                };
                    FileList.Add(File);

                    Hashtable HashedFiles = new Hashtable();
                    HashedFiles.Add(file.Md5Checksum, file.Id);

                }
            }

将文件上传到Google驱动器:
     //file Upload to the Google Drive.
        public static void FileUpload(HttpPostedFileBase file, Hashtable HashedFiles)
        {
            if (file != null && file.ContentLength > 0)
            {
                DriveService service = GetService();

                string path = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"),
                Path.GetFileName(file.FileName));
                file.SaveAs(path);

                var FileMetaData = new Google.Apis.Drive.v3.Data.File();
                FileMetaData.Name = Path.GetFileName(file.FileName);
                FileMetaData.MimeType = MimeMapping.GetMimeMapping(path);

                FilesResource.CreateMediaUpload request;

                  using (var stream = new System.IO.FileStream(path, System.IO.FileMode.Open))
                {
                    request = service.Files.Create(FileMetaData, stream, FileMetaData.MimeType);
                    request.Fields = "id";
                    request.Upload();
                }
            }
        }

当您要创建一个静态哈希表属性时,是否意味着要自己声明哈希表?像哈希表本身的功能一样?
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,901
位置
英国
编程经验
10+
我会说既不插入它。重点是拥有公共财产或场地。但是,要实现它取决于。然后,您将其传递给它...在构造方法级别声明
C#:
    public Hashtable HashTableX { get; set; } = new Hashtable();
    public static Hashtable HashTableY;
然后,使用此伪样本,您可以与其进行交互
C#:
methodA()
{
           I am getting your meta data
           While getting data, I add said data to 哈希表
           Got the data? Great, send it to methodB
           methodB(someParam, HashTableX or so)
}

methodB (upload param, hash param)
{
          I am waiting for 哈希表 data from methodA to be passed here
          Do work with md5 data
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,480
位置
悉尼,澳大利亚
编程经验
10+
好的,对篇幅过长表示歉意。我将在这里解决问题。首先,我没有显示要为Google云端硬盘中的文件生成的哈希,因此我不确定是否是因为哈希代码问题。

哈希类(要在Google驱动器中生成文件的MD5哈希):
 //Get Hash Value

        public static void GenerateHash(HttpPostedFileBase file)
        {
            string directory = Path.Combine(HttpContext.Current.Server.MapPath("~/GoogleDriveFiles"),
                Path.GetFileName(file.FileName));

            using (var md5 = MD5.Create())
            {
                using (var stream = File.OpenRead(directory))
                {
                    var hash = md5.ComputeHash(stream);
                    var data = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();

                }
            }

        }
Why would you expect that to display anything to begin with? The method is declared void so it's not going to return anything and, within the method, you are assigning only to local variables. Even if data contains the correct hash, you never do anything useful with it.
 
最佳 底部