Автоматическая загрузка файла в Google Drive File Stream с помощью службы Windows - PullRequest
0 голосов
/ 12 июня 2018

Я сделал службу Windows, которая;

  1. Загружает файл CSV из регулярно обновляемой внутренней базы данных через WebClient каждый час.

  2. Поместите этот файл CSV в назначенную папку.

    • В исходном тестовом примере он был помещен в локальную папку на моем рабочем столе (C:).
    • Тестовый пример работал отлично.
  3. CSV заменит старый файл на вновь загруженный файл с тем же именем.

Как указано выше.Это отлично работает на локальной папке.Тем не менее, мы намерены, чтобы он работал через Google Drive File Stream.Так как у нас есть 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"); 
        }
    }

Мой вопрос: почему я не могу в настоящее время автоматически загружать файл в Google Drive File Stream через службу Windows?Это потому, что Google Drive File Stream требует определенных разрешений или действий?Это потому, что диск "виртуальный", а не физический (H :)?Ниже находится папка, в которую я пытаюсь загрузить файл Google Stream File Stream (H: \ My Drive \ Test).

Google Drive File Stream

Код также выполняетсяполностью, поскольку файлы журнала показывают, что методы используются.Однако между загрузкой и размещением CSV-файла в папке «Поток файлов на Google Диске», по-видимому, существует некоторый блок.

Обновление: Пока что достигнут незначительный прогресс.Один из моих коллег, возможно, предполагает, что нужно что-то запрашивать у пользователя разрешения на нажатие.Как имя пользователя и пароль.Если это правда, кто-нибудь знает, как мне этого добиться?

Обновление № 2: В «Редакторе реестра» я нашел интересную информацию.

  1. Нажмите Windows + R
  2. Введите regedit.exe
  3. HKEY_CURRENT_USER -> ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ -> Google -> DriveFS -> Поделиться

enter image description here

Как видите, есть два значения.«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");

enter image description here

Не работает при помещении в папку Файлового потока Google Диска.

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

enter imagription here

Для уточнения по поводу теста.Я на самом деле получаю два файла CSV.Тем не менее, код в основном такой же.Поэтому я упоминаю только один вопрос в моем первоначальном вопросе, чтобы он был чище и понятнее.

1 Ответ

0 голосов
/ 15 июня 2018

Я нашел решение!Это может быть не оптимально для всех случаев, однако в моем случае это работает.

Вот что я сделал;

  1. Создайте установщик проекта с помощью InstallerProjects.vsiz ,Очевидно, что если вы используете другую версию VS, это может измениться.Некоторые из более старых версий уже поставляются с ним, и более новые версии не включают его автоматически.Вам также нужно будет найти соответствующую версию, так как она связана с VS2017. Здесь - это учебное пособие по реализации установщика в службе Windows.
  2. После того, как вы внедрили установщик, щелкните правой кнопкой мыши serviceProcessInstaller1 (или как вы решили его назвать) и выберите свойства.,
  3. В окне свойств найдите поле «Учетная запись» и установите для него значение «Пользователь».serviceProcessInstaller1 Properties
  4. Сохраните и постройте свой проект.Вот и все.

Что это на самом деле делает? На простом английском языке;По сути, это делает службу олицетворением пользователя, чтобы он мог читать и записывать файлы в системе.


При установке на другой компьютер, на котором была создана служба, «Защитник Windows» будет блокироватьсервис от установки.Это только Windows, осторожно.Очевидно, что если вы создали сервис без злого умысла, это не повредит вашему компьютеру.

Чтобы продолжить установку, нажмите «Подробнее» на экране «Защитник Windows» и нажмите «Запустить в любом случае».Windows Defender Shield

Прежде чем Служба завершит установку, она остановится и запросит информацию о пользователе.В большинстве случаев недостаточно предоставления собственной пользовательской информации.

Installation User Information

Если вы являетесь пользователем домена или чего-либо подобного.Вам нужно будет добавить префикс домена в поле «Имя пользователя».Example: DOMAIN\user.name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...