使用 Windows 服务自动将文件上传到 Google 虚拟云端硬盘

Automatically uploading a file to Google Drive File Stream with a Windows Service

我做了一个 Windows 服务;

  1. 每小时通过 WebClient 从定期更新的内部数据库下载一个 CSV 文件。

  2. 将该 CSV 文件放入指定的文件夹中。

    • 在原来的测试用例中,它被放入我桌面上的本地文件夹(C:)。
    • 测试用例运行完美。
  3. CSV 会用新下载的同名文件替换旧文件。

如上所述。这在本地文件夹上非常有效。但是,我们打算让它通过 Google 虚拟云端硬盘工作。因为我们有一个 Google Sheet 可以为我们操作和查找给定名称下的任何 CSV 文件的数据。

这是当前下载和放置文件的方法。

public void CSVDownload()
    {
        string url = @"YOUR_CSV_URL_HERE";
        WebClient client = new WebClient();
        client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);

        client.DownloadFileAsync(new Uri(url), @"YOUR_GOOGLE_DRIVE_FILE_STREAM_FOLDER_HERE\NAME.csv"); 

        void client_DownloadFileCompleted(object CSVDownload, AsyncCompletedEventArgs e)
        {
            eventLog1.WriteEntry("CSV File (NAME.csv) downloaded"); 
        }
    }

我的问题是,为什么我目前不能通过 Windows 服务自动将文件上传到 Google 虚拟云端硬盘?是因为 Google 虚拟云端硬盘需要某些权限或操作吗?是因为驱动器是 "virtual" 而不是物理驱动器 (H:) 吗?下面是我尝试上传到 Google 虚拟云端硬盘 (H:\My Drive\Test) 中的文件夹。

代码也 运行 完全通过,因为日志文件显示使用了这些方法。但是,在下载和将 CSV 文件放入 Google 虚拟云端硬盘文件夹之间似乎存在一些障碍。

更新:目前进展不大。我的一位同事可能建议需要获得一些用户许可才能推送。就像用户名和密码一样。如果这是真的,有人知道我如何实现吗?

更新 #2: 在 'Registry Editor' 我发现了一些有趣的信息。

  1. 按Windows + R
  2. 类型regedit.exe
  3. HKEY_CURRENT_USER -> 软件 -> Google -> DriveFS -> 共享

如您所见,有两个值。 'MountPoint = H' 显然是它映射到的驱动器号,而 'ShellIpcPath = \.\Pipe\GoogleDriveFSPipe_user.name_shell' 可能会有用。我玩过 ShellcpPath 但没有成功。

更新 #3: @Ben Voigt 提到使用 DriveInfo.GetDrives() 查看服务是否找到驱动器。我 运行 代码,它看起来确实存在。 这是控制台输出的内容:

Drive H:\
  Drive type: Fixed
  Volume label: Google Drive File Stream
  File system: FAT32
  Available space to current user:    15987068928 bytes
  Total available space:              15987068928 bytes
  Total size of drive:                16106127360 bytes

如您所见,它存在,但它使用 File system: FAT32 而不是我所有其他驱动器使用的 File system: NTFS (C:)、(D:) 等。所以似乎只有 Google 虚拟云端硬盘使用 FAT32。

测试用例:

将 CSV 文件放入本地文件夹时效果很好。

client.DownloadFileAsync(new Uri(url), @"C:\Users\user.name\Desktop\Test\designtasks.csv");
client.DownloadFileAsync(new Uri(url), @"C:\Users\user.name\Desktop\Test\designjobs.csv");

放入 Google 虚拟云端硬盘文件夹时不起作用。

client.DownloadFileAsync(new Uri(url), @"H:\My Drive\Test\designtasks.csv");
client.DownloadFileAsync(new Uri(url), @"H:\My Drive\Test\designjobs.csv");

澄清测试用例。我实际上得到了两个 CSV 文件。但是,代码基本相同。所以我只提到在我原来的问题中得到一个,以保持它更清晰和更直接。

我找到了解决办法!它可能不是对所有情况都是最佳的,但它适用于我的情况。

这是我做的;

  1. 使用 InstallerProjects.vsiz. Obviously, if you are using a different version of VS, this might change. Some of the older version already come with it installed and the newer versions do not automatically include it. You will have to also find the correlating version as the one linked is for VS2017. Here 制作项目安装程序是关于如何在 windows 服务上实施安装程序的教程。
  2. 实施安装程序后,右键单击 serviceProcessInstaller1(或您决定调用的任何名称)和 select 属性。
  3. 在属性 window 中,查找 'Account' 字段并将其设置为 'User'。
  4. 保存并构建您的项目。就是这样。

这实际上是做什么的?用简单的英语;它基本上使服务模拟用户,因此它可以在系统上读取和写入文件。


在构建服务的不同计算机上安装时,'Windows Defender Shield' 将阻止安装服务。这只是Windows带来的谨慎。显然,如果您构建服务时没有恶意,这不会损害您的计算机。

要继续安装,请在 'Windows Defender Shield' 屏幕上单击 "More info",然后单击 "Run anyway"。

在服务完成安装之前,它会停止并询问用户信息。在大多数情况下,给它你自己的用户信息是不够的。

如果您是某个域的用户或类似的任何内容。您需要将域前缀添加到 'Username' 字段。 Example: DOMAIN\user.name.