Я пытаюсь скопировать файл из одной папки в другую, используя API-интерфейс google drive С#.
К сожалению, нет документации (которую я могу найти) для этого в C#: https://developers.google.com/drive/api/guides/папка
Вот несколько способов, которые я пробовал:
Google.Apis.Drive.v3.Data.File file = _files.Where(x => x.Name == fileName).First();
_driveService.Files.Update(file, file.Id).AddParents = _destinationFolderId;
_driveService.Files.Update(file, file.Id).Execute();
Google.Apis.Drive.v3.Data.File file = _files.Where(x => x.Name == fileName).First();
file.Parents = new List<string> { _destinationFolderId };
_driveService.Files.Update(file, file.Id).Execute();
Google.Apis.Drive.v3.Data.File file = _files.Where(x => x.Name == fileName).First();
_driveService.Files.Update(file, file.Id).Fields = "addParents";
_driveService.Files.Update(file, file.Id).Execute();
Однако все они выдают ошибку:
Служебный диск вызвал исключение. HttpStatusCode запрещен. Поле родителей недоступно для прямой записи в запросах на обновление. Вместо этого используйте параметры addParents и removeParents.
Я не вижу параметров addParents или удалитьРодители, как в API Python:
file = drive_service.files().update(fileId=file_id,
addParents=folder_id,
removeParents=previous_parents,
fields='id, parents').execute()
Возможно, сообщение об ошибке вводит в заблуждение/неверно?





Метод обновления соответствует методологии исправления. Это означает, что вы отправляете только то, что хотите обновить, а не другие поля.
Однако обновление родителей немного отличается: для этого требуется пользователь методов AddParents и RemoveParents. Если вы на самом деле не хотите изменять какие-либо другие метаданные в файле, вы можете просто отправить нулевое значение для тела файла.
var updateRequest = service.Files.Update(null, fileId);
updateRequest.AddParents = folderId;
updateRequest.Execute();
Попробуйте обновить, если это не сработает, я соберу образец за обедом.
@DalmTo Я пытался использовать метод AddParents для объекта запроса, но AddParents, похоже, является свойством получателя/установщика. Я все равно пробовал, и получаю другую, хотя и похожую ошибку: The service drive has thrown an exception. HttpStatusCode is Forbidden. The resource body includes fields which are not directly writable
вы в том числе во многих областях. в метаданных еще. Просто добавьте идентификатор ничего больше.
@DalmTo вот точный код, который вызывает ошибку. Выдает request.Execute: <pre><code> var fileMetadata = new Google.Apis.Drive.v3.Data.File() { Id = fileId }; запрос var = _driveService.Files.Update(fileMetadata, fileMetadata.Id); request.AddParents = "1BnhmtN_2hXLLgRbY***************"; var результат = запрос.Выполнить(); </код></пре>
Извините, что так долго, я был занят сегодня. Ее рабочий пример.
Спасибо за ответ. Я думаю, что действительно прочитал полезную статью, которую вы написали об API Google Диска. Во всяком случае, я все еще получаю ту же ошибку при использовании предложенного кода в вашем ответе.