コード例 #1
0
ファイル: SFTP.cs プロジェクト: zhonghai/ShareX
        private bool UploadStream(Stream stream, string remotePath)
        {
            if (Connect())
            {
                try
                {
                    using (SftpFileStream sftpStream = client.OpenWrite(remotePath))
                    {
                        return(TransferData(stream, sftpStream));
                    }
                }
                catch (SftpPathNotFoundException)
                {
                    // Happens when directory not exist, create directory and retry uploading

                    CreateDirectory(URLHelpers.GetDirectoryPath(remotePath));

                    using (SftpFileStream sftpStream = client.OpenWrite(remotePath))
                    {
                        return(TransferData(stream, sftpStream));
                    }
                }
                catch (NullReferenceException)
                {
                    // Happens when disconnected while uploading
                }
            }

            return(false);
        }
コード例 #2
0
 private void UploadStream(Stream stream, string path)
 {
     using (SftpFileStream sftpStream = client.OpenWrite(path))
     {
         TransferData(stream, sftpStream);
     }
 }
コード例 #3
0
 public Stream OpenWrite(string destFullPath)
 {
     // check folder existance
     CreateDirectory(PreparePath(FileTransferHelpers.SplitByLastPathPart(destFullPath).Item1));
     // upload
     return(client.OpenWrite(PreparePath(destFullPath)));
 }
コード例 #4
0
        public override void OpenFileForWriting(string name, DateTime lastWriteTimeUtc)
        {
            if (fileStream != null)
            {
                throw new Exception("Can't happen");
            }
            fileName = FullPathWithName(name);

            // TODO: Neither .Create() nor .OpenWrite() is exactly
            // right. We should really pass the SFTP file open mode
            // Flags.CreateNew which creates a new file and fails if
            // one already exists. Thid normally doesn't make a
            // difference in our use case since we delete the old
            // files first, but the user could have created a new file
            // between our DeleteFile and CreateFile ops so
            // Flags.CreateNew would be more bulletproof.

            // Furthermore, trying to change the file's last-modified
            // timestamp after a .Create() doesn't work. So on that
            // count we have to use .OpenWrite().  I spend a moment
            // looking at the libary code but didn't manage to find
            // out what causes the situation.
            fileStream           = sftpClient.OpenWrite(WireEncodedString(fileName));
            fileLastWriteTimeUtc = lastWriteTimeUtc;
        }
コード例 #5
0
        public void SendFile(string ftpDirectory, string sourcePath)
        {
            _sftpClient.Connect();

            try
            {
                using (var fileStream = File.OpenRead(sourcePath))
                    using (var ftpStream = _sftpClient.OpenWrite(string.Format("{0}/{1}", ftpDirectory, Path.GetFileName(sourcePath))))
                    {
                        var buffer = new byte[8 * 1024];
                        int count;
                        while ((count = fileStream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            ftpStream.Write(buffer, 0, count);
                        }
                    }
            }
            finally
            {
                _sftpClient.Disconnect();
            }
        }
コード例 #6
0
        private bool UploadStream(Stream stream, string remotePath)
        {
            if (Connect())
            {
                try
                {
                    using (SftpFileStream sftpStream = client.OpenWrite(remotePath))
                    {
                        return(TransferData(stream, sftpStream));
                    }
                }
                catch (SftpPathNotFoundException)
                {
                    CreateDirectory(URLHelpers.GetDirectoryPath(remotePath));

                    using (SftpFileStream sftpStream = client.OpenWrite(remotePath))
                    {
                        return(TransferData(stream, sftpStream));
                    }
                }
            }

            return(false);
        }
コード例 #7
0
        private static long UploadFolder(HostEntry host, string pathInfo, SftpClient client, StreamWriter log)
        {
            long uploadSize = 0;

            string[] paths        = pathInfo.Split(';');
            string   localDir     = paths[0];
            string   remoteFolder = paths[1];

            string[] localFiles = Directory.GetFiles(localDir, "*", SearchOption.AllDirectories);
            Parallel.ForEach(localFiles, file =>
            {
                if (host.IgnoreRegex != null && host.IgnoreRegex.IsMatch(file))
                {
                    return;
                }

                var localDirForFile = Path.GetDirectoryName(file);
                var localFile       = Path.GetFileName(file);
                var remoteDir       = Path.Combine(remoteFolder, localDirForFile.Substring(localDir.Length));
                var remoteFile      = remoteDir + "/" + localFile;

                try
                {
                    long prevProgress     = 0;
                    using var localStream = File.OpenRead(file);
                    if (!client.Exists(remoteDir))
                    {
                        client.CreateDirectory(remoteDir);
                    }
                    using var remoteStream = client.OpenWrite(remoteFile);
                    localStream.CopyTo(remoteStream, bytesUploaded =>
                    {
                        Interlocked.Add(ref AutoSSHApp.bytesUploaded, ((long)bytesUploaded - prevProgress));
                        prevProgress = (long)bytesUploaded;
                    });
                    Interlocked.Add(ref uploadSize, prevProgress);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error uploading file {0} to {1}: {2}", localFiles, remoteFile, ex);
                }
            });
            return(uploadSize);
        }
コード例 #8
0
        public string UploadLogoFile(string logoName, string filePath)
        {
            try
            {
                string remoteFileName = $@"/root/srs/trunk/etc/{logoName}.png";
                using (var sftp = new SftpClient(_host, _port, _username, _password))
                {
                    sftp.Connect();
                    if (sftp.Exists(remoteFileName))
                    {
                        sftp.DeleteFile(remoteFileName);
                    }

                    using (var rfs = sftp.OpenWrite(remoteFileName))
                    {
                        int    offsetPos     = 0;
                        int    maxBufferSize = 1024 * 50;
                        byte[] buffer;
                        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                        {
                            fs.Position = 0;
                            while (fs.Position < fs.Length)
                            {
                                int bufferLength = (fs.Length - offsetPos) > maxBufferSize ? maxBufferSize : (int)(fs.Length - offsetPos);
                                buffer = new byte[bufferLength];
                                fs.Read(buffer, 0, (int)bufferLength);
                                offsetPos += bufferLength;
                                rfs.Write(buffer, 0, bufferLength);
                                if (bufferLength < maxBufferSize)
                                {
                                    rfs.Flush();
                                }
                            }
                        }
                    }
                }
                return(remoteFileName);
            }
            catch (Exception e)
            {
                throw;
            }
        }
コード例 #9
0
 public SftpFileStream OpenWrite(string path)
 {
     return(_client.OpenWrite(path));
 }
コード例 #10
0
ファイル: SftpClientTest.cs プロジェクト: pecegit/sshnet
 public void OpenWriteTest()
 {
     ConnectionInfo connectionInfo = null; // TODO: Initialize to an appropriate value
     SftpClient target = new SftpClient(connectionInfo); // TODO: Initialize to an appropriate value
     string path = string.Empty; // TODO: Initialize to an appropriate value
     SftpFileStream expected = null; // TODO: Initialize to an appropriate value
     SftpFileStream actual;
     actual = target.OpenWrite(path);
     Assert.AreEqual(expected, actual);
     Assert.Inconclusive("Verify the correctness of this test method.");
 }
コード例 #11
0
        static void Main(string[] args)
        {
            ConsoleInterop.DisableQuickEdit();
            Console.CursorVisible = false;

            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_ServerKey))
            {
                SFTP_Server = ConfigurationManager.AppSettings[SFTP_ServerKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_PortKey))
            {
                SFTP_Port = int.Parse(ConfigurationManager.AppSettings[SFTP_PortKey]);
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_UserKey))
            {
                SFTP_User = ConfigurationManager.AppSettings[SFTP_UserKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_PasswordKey))
            {
                SFTP_Password = ConfigurationManager.AppSettings[SFTP_PasswordKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_PublishedFilesDirectoryKey))
            {
                SFTP_PublishedFilesDirectory = ConfigurationManager.AppSettings[SFTP_PublishedFilesDirectoryKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_UploadedFilesDirectoryKey))
            {
                SFTP_UploadedFilesDirectory = ConfigurationManager.AppSettings[SFTP_UploadedFilesDirectoryKey];
            }
            SFTP_Credentials = new NetworkCredential(SFTP_User, SFTP_Password);
            _sftpClient      = new SftpClient(SFTP_Server, SFTP_Port, SFTP_Credentials.UserName, SFTP_Credentials.Password);

            if (ConfigurationManager.AppSettings.AllKeys.Contains(FTP_ServerKey))
            {
                FTP_Server = ConfigurationManager.AppSettings[FTP_ServerKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(FTP_PortKey))
            {
                FTP_Port = int.Parse(ConfigurationManager.AppSettings[FTP_PortKey]);
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(FTP_UserKey))
            {
                FTP_User = ConfigurationManager.AppSettings[FTP_UserKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(FTP_PasswordKey))
            {
                FTP_Password = ConfigurationManager.AppSettings[FTP_PasswordKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(FTP_PublishedFilesDirectoryKey))
            {
                FTP_PublishedFilesDirectory = ConfigurationManager.AppSettings[FTP_PublishedFilesDirectoryKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(FTP_UploadedFilesDirectoryKey))
            {
                FTP_UploadedFilesDirectory = ConfigurationManager.AppSettings[FTP_UploadedFilesDirectoryKey];
            }
            FTP_Credentials = new NetworkCredential(FTP_User, FTP_Password);

            Console.Write("Add project dispositions if not exist : ");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                ExecuteScript(sqlConn, "ProjectDispositionMemorized");
            }
            Console.WriteLine("OK\n");

            Console.WriteLine("Add IsDeleted to Audit if not exists");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                ExecuteCommandFormat <int>(sqlConn, $"EXEC AddColumnIfNotExists 'Audit', 'IsDeleted', '[BIT] NOT NULL DEFAULT((0))';");
                sqlConn.Close();
            }
            Console.WriteLine("OK\n");

            Console.WriteLine("Add LinkedInspectionId to InspectionStep if not exists");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                bool exists = false;
                using (SqlDataReader reader = ExecuteCommandFormat <SqlDataReader>(sqlConn, $"SELECT column_id FROM sys.columns WHERE NAME = 'LinkedInspectionId' AND object_id = OBJECT_ID('InspectionStep');"))
                {
                    exists = reader.HasRows;
                    reader.Close();
                    sqlConn.Close();
                }
                Console.WriteLine($"LinkedInspectionId exists : {(exists ? "Yes\n" : "No")}");
                if (!exists)
                {
                    Console.Write("Clear all inspections : ");
                    ExecuteScript(sqlConn, "ClearAllInspections");
                    Console.WriteLine("OK");
                    Console.Write("Add LinkedInspectionId to InspectionStep : ");
                    ExecuteScript(sqlConn, "AddInspectionStep_LinkedInspectionStep");
                    Console.WriteLine("OK\n");
                }
            }

            Console.WriteLine("Add QualificationReason table if not exists");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                bool exists = false;
                using (SqlDataReader reader = ExecuteCommandFormat <SqlDataReader>(sqlConn, $"SELECT * FROM sys.tables WHERE NAME = 'QualificationReason';"))
                {
                    exists = reader.HasRows;
                    reader.Close();
                    sqlConn.Close();
                }
                Console.WriteLine($"QualificationReason table exists : {(exists ? "Yes\n" : "No")}");
                if (!exists)
                {
                    Console.Write("Add QualificationReason table : ");
                    ExecuteScript(sqlConn, "QualificationReason");
                    Console.WriteLine("OK\n");
                }
            }

            Console.WriteLine("Add IsDeleted and AnomalyOrigin if not exist");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                ExecuteScript(sqlConn, "IsDeleted_AnomalyOrigin");
            }
            Console.WriteLine("OK\n");

            Console.WriteLine("Extract thumbnails");
            string thumbnailsDir = @"C:\Utils\Thumbnails";

            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                Console.Write("Configure OLE : ");
                ExecuteScript(sqlConn, "ConfigureOle", true, "master");
                Console.WriteLine("OK");
                WindowsIdentity currentIdentity = WindowsIdentity.GetCurrent();
                Console.Write($"Configure Role Server bulkadmin for {currentIdentity.Name} : ");
                ExecuteCommandFormat <int>(sqlConn, "ALTER SERVER ROLE [bulkadmin] ADD MEMBER [{0}];", currentIdentity.Name);
                Console.WriteLine("OK");
            }
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                Console.Write("Add ThumbnailHash to Action : ");
                ExecuteScript(sqlConn, "ActionThumbnailHash");
                Console.WriteLine("OK");
                Console.Write("Add Action_ExportThumbnail procedure : ");
                ExecuteScript(sqlConn, "Action_ExportThumbnail");
                Console.WriteLine("OK");
                Console.Write("Add Action_ExportAllThumbnail procedure : ");
                ExecuteScript(sqlConn, "Action_ExportAllThumbnail");
                Console.WriteLine("OK");
                Console.Write($"Create thumbnails directory ({thumbnailsDir}) : ");
                Directory.CreateDirectory(thumbnailsDir);
                Console.WriteLine("OK");
                Console.Write($"Extract thumbnails : ");
                ExecuteCommandFormat <int>(sqlConn, "EXECUTE dbo.[Action_ExportAllThumbnail] N'{0}', N'{1}';", thumbnailsDir, ".jpg");
                Console.WriteLine("OK");
                Console.Write($"List exported thumbnails : ");
                var thumbnails = Directory.EnumerateFiles(thumbnailsDir);
                Console.WriteLine("OK");
                Console.Write($"Compute hashes and rename thumbnails : ");
                Dictionary <int, (string hash, string extension)> hashThumbnailsDict = new Dictionary <int, (string hash, string extension)>();
                foreach (string thumbnail in thumbnails.Where(_ => int.TryParse(Path.GetFileNameWithoutExtension(_), out int tmpResult)))
                {
                    HashAlgorithm murmur128 = MurmurHash.Create128(managed: false);
                    string        newName;
                    using (var fileStream = File.OpenRead(thumbnail))
                    {
                        newName = ToHashString(murmur128.ComputeHash(fileStream));
                    }
                    hashThumbnailsDict.Add(int.Parse(Path.GetFileNameWithoutExtension(thumbnail)), (newName, Path.GetExtension(thumbnail)));
                    newName = $"{newName}{Path.GetExtension(thumbnail)}";
                    if (File.Exists(Path.Combine(thumbnailsDir, newName)))
                    {
                        File.Delete(thumbnail);
                    }
                    else
                    {
                        File.Move(thumbnail, Path.Combine(thumbnailsDir, newName));
                    }
                }
                Console.WriteLine("OK");
                Console.Write($"Insert thumbnails into CloudFile : ");
                var cloudFiles = new Dictionary <string, string>();
                foreach (var kv in hashThumbnailsDict)
                {
                    if (!cloudFiles.ContainsKey(kv.Value.hash))
                    {
                        cloudFiles.Add(kv.Value.hash, kv.Value.extension);
                    }
                }
                foreach (var kv in cloudFiles)
                {
                    ExecuteCommandFormat <int>(sqlConn, "INSERT INTO [dbo].[CloudFile] ([Hash],[Extension]) VALUES ('{0}','{1}');",
                                               kv.Key,
                                               kv.Value);
                }
                Console.WriteLine("OK");
                Console.Write($"Update CloudFile links in Action : ");
                foreach (var kv in hashThumbnailsDict)
                {
                    ExecuteCommandFormat <int>(sqlConn, "UPDATE [dbo].[Action] SET [ThumbnailHash] = '{0}' WHERE [ActionId] = {1};",
                                               kv.Value.hash,
                                               kv.Key);
                }
                Console.WriteLine("OK");
                Console.Write($"Delete Thumbnail from Action : ");
                ExecuteCommandFormat <int>(sqlConn, "ALTER TABLE [dbo].[Action] DROP COLUMN [Thumbnail];");
                Console.WriteLine("OK");
                Console.Write($"Delete Action_ExportAllThumbnail procedure : ");
                ExecuteCommandFormat <int>(sqlConn, "DROP PROCEDURE [dbo].Action_ExportAllThumbnail;");
                Console.WriteLine("OK");
                Console.Write($"Delete Action_ExportThumbnail procedure : ");
                ExecuteCommandFormat <int>(sqlConn, "DROP PROCEDURE [dbo].Action_ExportThumbnail;");
                Console.WriteLine("OK\n");
            }
            Console.Write("Copy thumbnails to SFTP : ");
            var  thumbnailsToCopy = Directory.EnumerateFiles(thumbnailsDir);
            long totalSize        = thumbnailsToCopy.Sum(_ => (new FileInfo(_)).Length);
            long alreadyCopied    = 0;

            byte[] buffer = new byte[BufferSize];
            try
            {
                _sftpClient.Connect();
                foreach (var thumbnailToCopy in thumbnailsToCopy)
                {
                    using (var localFileStream = File.OpenRead(thumbnailToCopy))
                        using (var remoteStream = _sftpClient.OpenWrite($"{SFTP_PublishedFilesDirectory}/{Path.GetFileName(thumbnailToCopy)}"))
                        {
                            int readBytes = localFileStream.Read(buffer, 0, buffer.Length);
                            while (readBytes > 0)
                            {
                                remoteStream.Write(buffer, 0, readBytes);
                                alreadyCopied += readBytes;
                                ConsoleProgress.Write("{0}%", alreadyCopied * 100 / totalSize);
                                readBytes = localFileStream.Read(buffer, 0, buffer.Length);
                            }
                        }
                }
                _sftpClient.Disconnect();
                ConsoleProgress.Finish("OK\n");
            }
            catch (Exception e)
            {
                Console.WriteLine("FAIL");
                Console.WriteLine(e.Message);

                Console.WriteLine("\nFinish.\nPress a key to exit...");
                Console.ReadKey();
                return;
            }

            Console.WriteLine("Add CloudFile links if not exist");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                ExecuteScript(sqlConn, "CloudFile_Links");
            }
            Console.WriteLine("OK\n");

            Console.WriteLine("Migrate videos of projects to videos of processes");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                Console.Write("Insert video resources : ");
                ExecuteScript(sqlConn, "VideoResources");
                Console.WriteLine("OK");
                Console.Write("Add VideoSync table if not exists : ");
                ExecuteScript(sqlConn, "VideoSync");
                Console.WriteLine("OK");
                Console.Write("Update Video if necessary : ");
                ExecuteScript(sqlConn, "VideoProjectToProcess");
                Console.WriteLine("OK\n");
            }

            Console.WriteLine("Fix hashes");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                Console.Write("Part 1 : ");
                ExecuteScript(sqlConn, "FixHashes1");
                Console.WriteLine("OK");
                string constraintName = null;
                Console.Write("Update PublishedFile.Hash : ");
                using (SqlDataReader reader = ExecuteCommandFormat <SqlDataReader>(sqlConn, $"SELECT c.[name] FROM[sys].[key_constraints] c INNER JOIN[sys].[objects] o ON c.[parent_object_id] = o.[object_id] WHERE c.[type] = 'PK' AND o.[name] = 'PublishedFile';"))
                {
                    if (reader.HasRows)
                    {
                        reader.Read();
                        constraintName = reader.GetString(0);
                    }
                    reader.Close();
                    sqlConn.Close();
                }
                if (!string.IsNullOrEmpty(constraintName))
                {
                    ExecuteCommandFormat <int>(sqlConn, "ALTER TABLE [dbo].[PublishedFile] DROP CONSTRAINT {0};", constraintName);
                }
                ExecuteCommandFormat <int>(sqlConn, "ALTER TABLE [dbo].[PublishedFile] ALTER COLUMN [Hash] NCHAR(32) NOT NULL;");
                ExecuteCommandFormat <int>(sqlConn, "ALTER TABLE [dbo].[PublishedFile] ADD CONSTRAINT PK_PublishedFile PRIMARY KEY (Hash);");
                Console.WriteLine("OK");
                constraintName = null;
                Console.Write("Update CutVideo.Hash : ");
                using (SqlDataReader reader = ExecuteCommandFormat <SqlDataReader>(sqlConn, $"SELECT c.[name] FROM[sys].[key_constraints] c INNER JOIN[sys].[objects] o ON c.[parent_object_id] = o.[object_id] WHERE c.[type] = 'PK' AND o.[name] = 'CutVideo';"))
                {
                    if (reader.HasRows)
                    {
                        reader.Read();
                        constraintName = reader.GetString(0);
                    }
                    reader.Close();
                    sqlConn.Close();
                }
                if (!string.IsNullOrEmpty(constraintName))
                {
                    ExecuteCommandFormat <int>(sqlConn, "ALTER TABLE [dbo].[CutVideo] DROP CONSTRAINT {0};", constraintName);
                }
                ExecuteCommandFormat <int>(sqlConn, "ALTER TABLE [dbo].[CutVideo] ALTER COLUMN [Hash] NCHAR(32) NOT NULL;");
                ExecuteCommandFormat <int>(sqlConn, "ALTER TABLE [dbo].[CutVideo] ADD CONSTRAINT PK_CutVideo PRIMARY KEY (Hash);");
                Console.WriteLine("OK");
                Console.Write("Part 2 : ");
                ExecuteScript(sqlConn, "FixHashes2");
                Console.WriteLine("OK\n");
            }

            Console.WriteLine("Add Timeslot if not exist");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                ExecuteScript(sqlConn, "Timeslot");
            }
            Console.WriteLine("OK\n");

            Console.WriteLine("Add InspectionSchedule if not exist");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                ExecuteScript(sqlConn, "InspectionSchedule");
            }
            Console.WriteLine("OK\n");

            Console.Write("Copy FTP files to SFTP : ");
            if (FTP_to_SFTP())
            {
                ConsoleProgress.Finish("OK\n");
            }
            else
            {
                ConsoleProgress.Finish("FAIL\n");
            }

            Console.WriteLine("\nFinish.\nPress a key to exit...");
            Console.ReadKey();
        }
コード例 #12
0
        static void Main(string[] args)
        {
            ConsoleInterop.DisableQuickEdit();
            Console.CursorVisible = false;

            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_ServerKey))
            {
                SFTP_Server = ConfigurationManager.AppSettings[SFTP_ServerKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_PortKey))
            {
                SFTP_Port = int.Parse(ConfigurationManager.AppSettings[SFTP_PortKey]);
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_UserKey))
            {
                SFTP_User = ConfigurationManager.AppSettings[SFTP_UserKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_PasswordKey))
            {
                SFTP_Password = ConfigurationManager.AppSettings[SFTP_PasswordKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_PublishedFilesDirectoryKey))
            {
                SFTP_PublishedFilesDirectory = ConfigurationManager.AppSettings[SFTP_PublishedFilesDirectoryKey];
            }
            if (ConfigurationManager.AppSettings.AllKeys.Contains(SFTP_UploadedFilesDirectoryKey))
            {
                SFTP_UploadedFilesDirectory = ConfigurationManager.AppSettings[SFTP_UploadedFilesDirectoryKey];
            }
            SFTP_Credentials = new NetworkCredential(SFTP_User, SFTP_Password);
            _sftpClient      = new SftpClient(SFTP_Server, SFTP_Port, SFTP_Credentials.UserName, SFTP_Credentials.Password);

            Console.Write("List CloudFile from database : ");
            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                ReadCloudFileFromDataBase(sqlConn);
            }
            Console.WriteLine("OK");

            using (var sqlConn = new SqlConnection(GetConnectionString()))
            {
                Console.Write("List files from database : ");
                ReadUriFromDataBase(sqlConn, "RefResource", "ResourceId");
                ReadUriFromDataBase(sqlConn, "RefActionCategory", "ActionCategoryId");
                ReadUriFromDataBase(sqlConn, "Ref1", "RefId");
                ReadUriFromDataBase(sqlConn, "Ref2", "RefId");
                ReadUriFromDataBase(sqlConn, "Ref3", "RefId");
                ReadUriFromDataBase(sqlConn, "Ref4", "RefId");
                ReadUriFromDataBase(sqlConn, "Ref5", "RefId");
                ReadUriFromDataBase(sqlConn, "Ref6", "RefId");
                ReadUriFromDataBase(sqlConn, "Ref7", "RefId");
                ReadUriFromDataBase(sqlConn, "Video", "VideoId", "FilePath");
                Console.WriteLine("OK");
            }

            Console.Write("Test if files exist : ");
            int totalFiles   = ResourceFiles.Count;
            int managedFiles = 0;

            ConsoleProgress.Write($"({managedFiles}/{totalFiles})");
            foreach (var file in ResourceFiles)
            {
                if (File.Exists(file.Uri))
                {
                    file.LocalFileExists = true;
                }
                else
                {
                    Log.WriteLine($"{file.TableName} file '{file.Uri}' doesn't exist.");
                }
                ConsoleProgress.Write($"({++managedFiles}/{totalFiles})");
            }
            ConsoleProgress.Finish("OK");

            Console.Write("Compute hashes : ");
            totalFiles   = ResourceFiles.Count(_ => _.LocalFileExists);
            managedFiles = 0;
            ConsoleProgress.Write($"({managedFiles}/{totalFiles})");
            HashAlgorithm murmur128 = MurmurHash.Create128(managed: false);

            foreach (var file in ResourceFiles.Where(_ => _.LocalFileExists))
            {
                using (var fileStream = File.OpenRead(file.Uri))
                {
                    file.Hash = ToHashString(murmur128.ComputeHash(fileStream));
                }
                ConsoleProgress.Write($"({++managedFiles}/{totalFiles})");
            }
            ConsoleProgress.Finish("OK");

            Console.Write("Copy files with hash name and update hash into tables : ");
            long totalSize     = ResourceFiles.Where(_ => _.LocalFileExists && _.Hash != null).Sum(_ => (new FileInfo(_.Uri)).Length);
            long alreadyCopied = 0;

            totalFiles = ResourceFiles.Count(_ => _.LocalFileExists && _.Hash != null);
            int copiedFiles = 0;

            byte[] buffer = new byte[BufferSize];
            ConsoleProgress.Write("({1}/{2}) {0}%", 0, copiedFiles, totalFiles);
            try
            {
                _sftpClient.Connect();
                foreach (var file in ResourceFiles.Where(_ => _.LocalFileExists && _.Hash != null))
                {
                    string sftpFilePath = $"{SFTP_PublishedFilesDirectory}/{file.Hash}{Path.GetExtension(file.Uri)}";
                    if (_sftpClient.Exists(sftpFilePath))
                    {
                        alreadyCopied += (new FileInfo(file.Uri)).Length;
                        copiedFiles++;
                        file.Copied = true;
                        ConsoleProgress.Write("({1}/{2}) {0}%", alreadyCopied * 100 / totalSize, copiedFiles, totalFiles);
                    }
                    else
                    {
                        using (var localFileStream = File.OpenRead(file.Uri))
                            using (var remoteStream = _sftpClient.OpenWrite(sftpFilePath))
                            {
                                int readBytes = localFileStream.Read(buffer, 0, buffer.Length);
                                while (readBytes > 0)
                                {
                                    remoteStream.Write(buffer, 0, readBytes);
                                    alreadyCopied += readBytes;
                                    ConsoleProgress.Write("({1}/{2}) {0}%", alreadyCopied * 100 / totalSize, copiedFiles, totalFiles);
                                    readBytes = localFileStream.Read(buffer, 0, buffer.Length);
                                }
                            }
                        copiedFiles++;
                        file.Copied = true;
                    }
                    using (var sqlConn = new SqlConnection(GetConnectionString()))
                    {
                        if (CloudFiles.Contains(file.Hash))
                        {
                            file.AlreadyInBase = true;
                        }
                        else if (file.TableName != "Video")
                        {
                            ExecuteCommandFormat <int>(sqlConn, "INSERT INTO [dbo].[CloudFile] ([Hash],[Extension]) VALUES ('{0}',{1})", file.Hash, string.IsNullOrEmpty(Path.GetExtension(file.Uri)) ? "NULL" : $"'{Path.GetExtension(file.Uri)}'");
                            CloudFiles.Add(file.Hash);
                        }
                        else if (file.TableName == "Video")
                        {
                            ExecuteCommandFormat <int>(sqlConn, "UPDATE [dbo].[Video] SET [OriginalHash] = '{1}' WHERE [VideoId] = {0};", file.Id, file.Hash);
                            // If video file is used in a project, set Sync to true
                            ExecuteCommandFormat <int>(sqlConn, "IF EXISTS (SELECT * FROM [dbo].[Action] WHERE [VideoId] = {0}) BEGIN UPDATE [dbo].[Video] SET [Sync] = 1 WHERE [VideoId] = {0}; END", file.Id);
                        }
                        ExecuteCommandFormat <int>(sqlConn, $"UPDATE [dbo].[{file.TableName}] SET [{ResourceFile.HashPropertyName}] = '{file.Hash}'{(file.TableName == "Video" ? $", Extension = '{Path.GetExtension(file.Uri)}', OnServer = 1" : string.Empty)} WHERE [{file.IdPropertyName}] = {file.Id};");
                    }
                }
                _sftpClient.Disconnect();
                ConsoleProgress.Finish("OK\n");
            }
            catch (Exception e)
            {
                Console.WriteLine("FAIL");
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);

                Console.WriteLine("\nFinish.\nPress a key to exit...");
                Console.ReadKey();
                return;
            }

            Console.WriteLine("\nFinish.\nPress a key to exit...");
            Console.ReadKey();
        }
コード例 #13
0
 public Task <Stream> OpenWrite(string fileName, DirectoryEnum directoryEnum = DirectoryEnum.Published)
 {
     Connect();
     return(Task.FromResult(_sftpClient.OpenWrite(GetFilePath(fileName, directoryEnum)) as Stream));
 }