private string CreateFolder(GDriveFile objGDriveFile)
        {
            string newFileId = null;

            Google.Apis.Drive.v3.Data.File newDirectory = null;

            // Create metaData for a new Directory
            Google.Apis.Drive.v3.Data.File body = new Google.Apis.Drive.v3.Data.File
            {
                Name        = objGDriveFile.Title,
                Description = objGDriveFile.Description,
                MimeType    = objGDriveFile.MimeType,
                Parents     = new List <string>()
                {
                    objGDriveFile.Parent
                },
            };

            using (DriveService service = this.AuthenticateServiceAccount())
            {
                FilesResource.CreateRequest request = service.Files.Create(body);
                request.Fields = "*";
                newDirectory   = request.Execute();
                newFileId      = newDirectory.Id;
            }

            return(newFileId);
        }
        public string CreateChildFolderOfRoot(string directoryTitle)
        {
            // TODO - think if GDriveFile Model is needed.
            // Can we just use the "File" class within GDrive API?
            var objGDriveFile = new GDriveFile
            {
                Parent      = this._gdriveFactorySettings.RootFolderId,
                MimeType    = GDriveFolderMimeType,
                Title       = directoryTitle,
                Description = string.Empty,
            };

            return(this.CreateFolder(objGDriveFile));
        }
        public override void Write(byte[] buffer, int offset, int count)
        {
            base.Write(buffer, offset, count);
            // Someday I will separate it out and make a PR to SharpFileSystem
            //string directoryID =
            //    db.ExecuteScalar("SELECT fileid FROM gdrive WHERE filename = 'distrodedup' AND directory = 1");
            string directoryID =
                db.ExecuteScalar("SELECT fileid FROM gdrive WHERE filename = @fileName AND directory = @directory",
                                 new Dictionary <string, object>()
            {
                { "@fileName", "distrodedup" },
                { "@directory", 1 }
            });

            if (directoryID == "")
            {
                File fileData = new File();
                fileData.Name     = "DistroDeDup";
                fileData.MimeType = "application/vnd.google-apps.folder";
                var req = svc.Files.Create(fileData);
                req.Fields = "id";
                var folder = req.Execute();
                //db.ExecuteNonQuery(
                //    $"INSERT INTO gdrive (filename, fileid, directory) VALUES ('distrodedup', '{folder.Id}', 1)");
                db.ExecuteNonQuery(
                    "INSERT INTO gdrive (filename, fileid, directory) VALUES (@fileName, @fileID, @directory)",
                    new Dictionary <string, object>()
                {
                    { "@fileName", "distrodedup" },
                    { "@fileID", folder.Id },
                    { "@directory", 1 }
                });

                directoryID = folder.Id;
            }

            //string fileId =
            //    db.ExecuteScalar($"SELECT fileid FROM gdrive WHERE filename = '{fileName}' AND directory = 0");
            string fileId =
                db.ExecuteScalar("SELECT fileid FROM gdrive WHERE filename = @fileName AND directory = @directory",
                                 new Dictionary <string, object>()
            {
                { "@fileName", fileName },
                { "@directory", 0 }
            });

            if (fileId != "")
            {
                FilesResource.ListRequest reqExists = svc.Files.List();
                reqExists.Q      = String.Format("name = '{0}' and trashed=false and parents in '{1}'", fileName, directoryID);
                reqExists.Fields = "nextPageToken, files(id, name,parents,mimeType, trashed)";
                var  result    = reqExists.Execute();
                bool foundFile = false;
                foreach (var file in result.Files)
                {
                    if (file.Id == fileId)
                    {
                        // I guess we need to create another file object?

                        /*File uploadFile = new File();
                         * uploadFile.Name = fileName;
                         * uploadFile.MimeType = mimeType;
                         * var res = svc.Files.Update(uploadFile, fileId, this, mimeType);
                         * var req = res.Upload();*/
                        GDriveFile f = new GDriveFile(this, fileName, mimeType, directoryID, db, GDriveFile.Operation.NONE);
                        f.Update(svc, fileId);
                        foundFile = true;
                        break;
                    }
                }

                if (!foundFile)
                {
                    GDriveFile f = new GDriveFile(this, fileName, mimeType, directoryID, db, GDriveFile.Operation.UPDATE);
                    f.Upload(svc);

                    /*File body = new File();
                     * body.Name = fileName;
                     * body.MimeType = mimeType;
                     * body.Parents = new List<string>();
                     * body.Parents.Add(directoryID);
                     * FilesResource.CreateMediaUpload req = svc.Files.Create(body, this, mimeType);
                     * req.Fields = "id, parents";
                     * var res = req.Upload();
                     * string newFileId = req.ResponseBody.Id;
                     *
                     * //db.ExecuteNonQuery(
                     * //    $"UPDATE gdrive set fileid = '{newFileId}' WHERE filename = '{fileName}' and directory = 0");
                     *
                     * db.ExecuteNonQuery(
                     *  "UPDATE gdrive set fileid = @newFileId WHERE filename = @fileName and directory = 0",
                     *  new Dictionary<string, object>()
                     *  {
                     *      {"@newFileId", newFileId},
                     *      {"@fileName", fileName}
                     *  });*/
                }
            }
            else
            {
                GDriveFile f = new GDriveFile(this, fileName, mimeType, directoryID, db, GDriveFile.Operation.CREATE);
                f.Upload(svc);

                /*File body = new File();
                 * body.Name = fileName;
                 * body.MimeType = mimeType;
                 * body.Parents = new List<string>();
                 * body.Parents.Add(directoryID);
                 * FilesResource.CreateMediaUpload req = svc.Files.Create(body, this, mimeType);
                 * req.Fields = "id, parents";
                 * req.ProgressChanged += ReqOnProgressChanged;
                 * //req.UploadAsync()
                 * var res = req.Upload();
                 *
                 * string newFileId = req.ResponseBody.Id;
                 *
                 * //db.ExecuteNonQuery(
                 * //    $"INSERT INTO gdrive (filename, fileid, directory) VALUES ('{fileName}', '{newFileId}', 0)");
                 * db.ExecuteNonQuery(
                 *  "INSERT INTO gdrive (filename, fileid, directory) VALUES (@fileName, @newFileId, 0)",
                 *  new Dictionary<string, object>()
                 *  {
                 *      {"@fileName", fileName},
                 *      {"@newFileID", newFileId}
                 *  });*/
            }
        }