Как получить полную иерархию файлов на диске Google с помощью Google Api V3 C# - PullRequest
0 голосов
/ 21 марта 2020

Я пишу своего рода приложение запуска и использую диск Google для хранения файлов для своего приложения. Программа запуска должна использовать метаданные файлов с диска Google для проверки целостности файлов.

Итак, я использую C# и Google.API (Google.Api.Drive.V3) для получения метаданных из Опубликуйте c ссылку на Google Drive. У меня есть служебная учетная запись, которая имеет доступ к папке, у меня есть JSON с его учетными данными, и я предоставил необходимый доступ для диска Google для указанной папки c, которая мне нужна. По сути, я хочу получить путь, который выглядит как (AllMods / modName / SomeSubfolder / Filename.dll).

Пока мне удалось получить список файлов и список папок.

       static string[] Scopes = new string[] {
            DriveService.Scope.Drive,
            DriveService.Scope.DriveAppdata,
            DriveService.Scope.DriveMetadata
     };

   public static List<string[]> getGoogleDiskModInfo(List<string> modList)
        {
            string folderid = "1EPjALeLqG9dT3c6YGup30u6dcmxVhsSB"; //public folder id
            List<string[]> fileInfo = new List<string[]>(); 

            GoogleCredential credential;
            using (var stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
            {
                credential = GoogleCredential.FromStream(stream)
                    .CreateScoped(Scopes);
            }

            var service = new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "servauth"
            });

            Google.Apis.Drive.v3.FilesResource.ListRequest listFolderRequest = service.Files.List();
            listFolderRequest.PageSize = 1000;
            listFolderRequest.Fields = "nextPageToken, files(id, name, md5Checksum, size, parents)";
            listFolderRequest.Q = "mimeType='application/vnd.google-apps.folder'";
            IList<Google.Apis.Drive.v3.Data.File> folders = listFolderRequest.Execute()
                .Files;
            string[,] arrayFolders = IListToArray(folders, null, false);
                Google.Apis.Drive.v3.FilesResource.ListRequest listFileRequest = service.Files.List();
            listFileRequest.PageSize = 1000;
            listFileRequest.Fields = "nextPageToken, files(id, name, md5Checksum, size, parents)";
            IList<Google.Apis.Drive.v3.Data.File> files = listFileRequest.Execute()
                .Files;
            int count1 = folders.Count();
            int count2 = files.Count();
            string[,] arrayFiles = IListToArray(files, folders, true);

После этого я выполняю рекурсивный поиск файлов из "IList files" по их родителям [0] и ищу папку в "папках IList" с соответствующим идентификатором для Parents [0] до Родители ноль. (Я вызываю эту функцию в IListToArray, где я в основном перезаписываю нужные мне данные из IList To Array, поэтому последующий поиск был бы быстрее)


 /// <summary>
        /// Makes recursive search, and updates the string if parent is found.
        /// </summary>
        /// <param name="file">file to search</param>
        /// <param name="files">IList of all folders with their respective meta</param>
        /// <param name="s">resulting path</param>
        /// <returns></returns>
        public static Google.Apis.Drive.v3.Data.File RecursiveSearch (Google.Apis.Drive.v3.Data.File file, IList<Google.Apis.Drive.v3.Data.File> files, ref string s)
        {
            if (file.Parents!=null)
            {
                string parentId = file.Parents[0];
                foreach (var potentialDirectory in files)
                {
                    if (potentialDirectory.Id == parentId)
                    {
                        s += "\\" + potentialDirectory.Name;
                        file = RecursiveSearch(potentialDirectory, files, ref s);
                        break;
                    }
                }
            }   
            return file;
        }

У меня возникли следующие вопросы и проблемы

  1. По какой-то причине папки, содержащиеся в папках IList, являются первыми родителями из файлов IList. (Есть также много повторяющихся имен (не идентификаторов), таких как DATA, это может вызвать какие-либо проблемы? "И, по какой-то причине, Folder.Count дает столько же, сколько файлов IList.Count. По сути, я получаю только некоторые подпапки папки, к которой я дал доступ, и не все из них.

  2. Как работает listFolderRequest.Q = "mimeType = 'application / vnd.google-apps.folder' "работает? Есть ли где-нибудь список mimeTypes? Маби, поиск - это проблема, которая его вызывает. Я не совсем понимаю, как использовать поиск в этих ситуациях. И я не понимаю, почему это дает только некоторые подпапки.

  3. Можно ли сделать запрос для всех файлов, включая папки и подпапки? Что-то, включая ". " idk.

Заранее спасибо

upd 1.

public static string[,] IListToArray(IList<Google.Apis.Drive.v3.Data.File> iList, IList<Google.Apis.Drive.v3.Data.File> folderList,  bool fullPath)
            {
                string[,] arrayFiles = new string[iList.Count, 6];
                int i = 0;

                foreach (var file in iList)
                {
                    if( fullPath)
                    {
                    string s = "";
                    RecursiveSearch(file, folderList, ref s);
                    arrayFiles[i, 0] = file.Name;
                    }
                    else arrayFiles[i, 0] = file.Name;

                    arrayFiles[i, 1] = file.Size.ToString();
                    arrayFiles[i, 2] = file.Id;
                    arrayFiles[i, 3] = file.Md5Checksum;
                    arrayFiles[i, 4] = file.WebContentLink;
                    if (file.Parents != null) arrayFiles[i, 5] = file.Parents[0];
                    else arrayFiles[i, 5] = null;
                    i++;
                }
                return arrayFiles;
            }

И метод рекурсивного поиска.

/// <summary>
        /// Makes recursive search, and updates the string if parent is found.
        /// </summary>
        /// <param name="file">file to search</param>
        /// <param name="files">IList of all folders with their respective meta</param>
        /// <param name="s">resulting path</param>
        /// <returns></returns>
        public static Google.Apis.Drive.v3.Data.File RecursiveSearch (Google.Apis.Drive.v3.Data.File file, IList<Google.Apis.Drive.v3.Data.File> files, ref string s)
        {
            if (file.Parents!=null)
            {
                string parentId = file.Parents[0];
                foreach (var potentialDirectory in files)
                {
                    if (potentialDirectory.Id == parentId)
                    {
                        s += "\\" + potentialDirectory.Name;
                        file = RecursiveSearch(potentialDirectory, files, ref s);
                        break;
                    }
                }
            }   
            return file;
        }
    ```
...