2

我做了一个 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 Drive File Stream?是因为 Google Drive File Stream 需要某些权限或操作吗?是因为驱动器是“虚拟的”而不是物理的(H:)?以下是我尝试在 Google Drive File Stream (H:\My Drive\Test) 中上传到的文件夹。

Google 虚拟云端硬盘

代码也完全运行,因为日志文件显示使用了这些方法。但是,在下载和将 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 文件。但是,代码基本相同。所以我只提到在我原来的问题中得到一个,以保持它更干净和更直接。

4

1 回答 1

0

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

这就是我所做的;

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

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


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

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

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

安装用户信息

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

于 2018-06-15T06:21:24.607 回答