Я пишу своего рода приложение запуска и использую диск 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;
}
У меня возникли следующие вопросы и проблемы
По какой-то причине папки, содержащиеся в папках IList, являются первыми родителями из файлов IList. (Есть также много повторяющихся имен (не идентификаторов), таких как DATA, это может вызвать какие-либо проблемы? "И, по какой-то причине, Folder.Count дает столько же, сколько файлов IList.Count. По сути, я получаю только некоторые подпапки папки, к которой я дал доступ, и не все из них.
Как работает listFolderRequest.Q = "mimeType = 'application / vnd.google-apps.folder' "работает? Есть ли где-нибудь список mimeTypes? Маби, поиск - это проблема, которая его вызывает. Я не совсем понимаю, как использовать поиск в этих ситуациях. И я не понимаю, почему это дает только некоторые подпапки.
Можно ли сделать запрос для всех файлов, включая папки и подпапки? Что-то, включая ". " 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;
}
```