这个代码已经让我挠头好几天了。
我正在尝试使用Google云端硬盘和服务帐户为我的应用程序实现自动更新。
在我的Google云端硬盘中,有一个名为Update的文件夹,它与服务帐户共享。在Update文件夹中有两个文件,一个是名为Version.txt的文本文件,它是最新版本号的字符串,另一个是可执行文件Update.exe,它是最新的应用程序版本。
我可以很好地阅读VersionIdenttxt文件,但当我试图下载~ 1 MB的可执行文件时,会有一个延迟,它似乎会经历下载文件的动作,但内存流ms 2之后总是空的。
有人有什么想法吗?这可能是一些与服务帐户身份验证,但我不知道如何修复它。
public class GoogleDriveAccess
{
//google drive file IDs
private readonly static string versionFileID = @"blahblahblahblah";
private readonly static string updateFileID = @"blehblehblehbleh";
//check for updated assembly on google drive and install if authorised
public async static void CheckForUpdate()
{
try
{
//load json key file from resources into a byte array
var jsonFile = Properties.Resources.drive_access;
//create service account keyfile from json byte array
var serviceAccountKeyfile = System.Text.Encoding.Default.GetString(jsonFile);
//create Google credentials with full access from service account keyfile
GoogleCredential credential = GoogleCredential.FromJson(serviceAccountKeyfile)
.CreateScoped(new[] { DriveService.ScopeConstants.Drive });
//create Google drive service using credentials
DriveService service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential
});
//get version file metadata
var getRequest = service.Files.Get(versionFileID);
//download version file to memory
await using var ms = new MemoryStream();
await getRequest.DownloadAsync(ms);
//read memory stream into a string
ms.Position = 0;
var sr = new StreamReader(ms);
string textUpdateVersion = sr.ReadToEnd().Trim();
//obtain our current assembly version
Version currentVersion = Assembly.GetEntryAssembly().GetName().Version;
//create an assembly version from the downloaded version text file
Version updateVersion = new Version(textUpdateVersion);
//if downloaded version is higher than our current version then request to download new assembly
if (updateVersion > currentVersion)
{
//prompt user to commence update
DialogResult result = MessageBox.Show($"Would you like to update to the latest version {updateVersion}?", Properties.Resources.AppName, MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
//get update file metadata
getRequest = service.Files.Get(updateFileID);
//download update file to memory
await using var ms2 = new MemoryStream();
await getRequest.DownloadAsync(ms2);
//***ms2 is always empty here***
//convert file to binary
ms2.Position = 0;
var br = new BinaryReader(ms2);
byte[] bin = br.ReadBytes(Convert.ToInt32(ms2.Length));
//rest of code
}
}
}
catch
{
//deal with any exceptions
}
}
}
2条答案
按热度按时间ars1skjm1#
file.get有一个可选的婴儿车
尝试将其设置为true
然后看看它是否不会让你下载它。
xzlaal3s2#
最后,谷歌似乎认为我的文件感染了病毒。
添加
getRequest.AcknowledgeAbuse
并没有改变任何东西,结果是一样的。将文件扩展名从
.exe
更改为.bin
也没有任何作用,因为Web应用程序仍将文件名视为update.bin.exe
。上传的文件是
.zip
可执行文件。似乎GD不喜欢这种类型的文件。上传一个重命名为
.bin
的非压缩.exe
文件似乎已经解决了这个问题。现在我的流终于有了文件内容。