【问题标题】:Automatically uploading a file to Google Drive File Stream with a Windows Service使用 Windows 服务自动将文件上传到 Google 虚拟云端硬盘
【发布时间】:2018-11-21 07:06:14
【问题描述】:

我已经做了一个 Windows 服务;

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

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

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

如上所列。这在本地文件夹上完美运行。但是,我们打算让它通过 Google Drive File Stream 工作。因为我们有一个 Google 表格,它可以为我们处理和查找给定名称下的任何 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 Drive File Stream 需要某些权限或操作吗?是因为驱动器是“虚拟的”而不是物理的(H:)?以下是我尝试在 Google Drive File Stream (H:\My Drive\Test) 中上传到的文件夹。

代码也完全运行,因为日志文件显示使用了这些方法。但是,在下载 CSV 文件并将其放入 Google Drive File Stream 文件夹之间似乎存在一些障碍。

更新:到目前为止进展甚微。我的一位同事可能建议需要一些用户许可才能推送。就像用户名和密码一样。如果这是真的,有谁知道我如何做到这一点?

更新 #2: 在“注册表编辑器”中,我发现了一些有趣的信息。

  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 Drive File Stream 使用 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 Drive File Stream 文件夹时不起作用。

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

澄清测试用例。我实际上得到了两个 CSV 文件。但是,代码基本相同。因此,我只提到在我最初的问题中添加一个以使其更简洁明了。

【问题讨论】:

  • 所以文件已下载到 H:\My Drive\Test 但未上传/与 Drive 同步?
  • @kennyzx 该文件根本不存在。它通过下载和上传的方法运行,但是文件不显示在文件路径中,也不显示在计算机的其他任何地方。我知道该方法适用于本地驱动器文件夹。它似乎只是在方法和 Google Drive Stream 文件夹之间的某个地方迷路了。
  • 驱动器映射到 Windows 网络重定向器,以及通过 subst,是用户特定的。可能您映射的 Google Drive 虚拟驱动器也是特定于用户的。然后您的服务在不同的用户上下文中运行......您在HKCU 中找到相关注册表项这一事实当然支持这种可能性。
  • 让服务将它看到的驱动器列表 (DriveInfo.GetDrives()) 写入您所称的“本地文本文件”,与运行普通应用程序获得的相同结果进行比较。跨度>
  • @BenVoigt 我已根据您的建议进行了更新 #3,并获得了一些有趣的信息。

标签: c# windows-services webclient google-drive-shared-drive


【解决方案1】:

我找到了解决方案!它可能不适用于所有情况,但它适用于我的情况。

这就是我所做的;

  1. 使用InstallerProjects.vsiz 制作项目安装程序。显然,如果您使用的是不同版本的 VS,这可能会改变。一些较旧的版本已经安装了它,而较新的版本不会自动包含它。您还必须找到相关版本,因为链接的是 VS2017。 Here 是关于如何在 Windows 服务上实现安装程序的教程。
  2. 实施安装程序后,右键单击 serviceProcessInstaller1(或您决定调用的任何名称)并选择属性。
  3. 在属性窗口中,查找“帐户”字段并将其设置为“用户”。
  4. 保存并构建您的项目。就是这样。

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


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

要继续安装,请单击“Windows Defender Shield”屏幕上的“更多信息”,然后单击“仍然运行”。

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

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

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多