123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- using System.Data.SqlClient;
- using System.Linq;
- using Dapper;
- using System.IO;
- using System;
- using log4net;
- using Agent.Models;
- using System.Configuration;
- namespace Agent.Services
- {
- class FileTableService
- {
- private static readonly ILog log = LogManager.GetLogger(typeof(FileTableService));
- /// <summary>
- /// 디렉토리 조회
- /// </summary>
- public string GetDirectory(SqlConnection con, string name)
- {
- try
- {
- var sql = $@"
- SELECT TOP 1 path_locator.ToString()
- FROM DI_FILE.[dbo].[di_backup_file]
- WHERE 1=1
- AND name = @DirectoryName
- AND is_directory = 1
- ";
- return con.Query<string>(sql, new { DirectoryName = name }).SingleOrDefault();
- }
- catch (Exception)
- {
- throw;
- }
- }
- /// <summary>
- /// 디렉토리 생성
- /// </summary>
- public string CreateDirectory(SqlConnection con, SqlTransaction transaction, string name, string parentId)
- {
- try
- {
- var sql = @"
- DECLARE @parent_node hierarchyid, @node hierarchyid
- SET @parent_node = CAST(@ParentId AS hierarchyid)
- SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node
- INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], is_directory, path_locator)
- OUTPUT
- INSERTED.path_locator.ToString()
- VALUES (@Name, 1, @parent_node.GetDescendant(@node, NULL))
- ";
- return con.Query<string>(sql, new { @Name = name, @ParentId = parentId }, transaction).SingleOrDefault();
- }
- catch (Exception)
- {
- throw;
- }
- }
- public string CreateDirectory(string name, string parentId)
- {
- try
- {
- var sql = @"
- DECLARE @parent_node hierarchyid, @node hierarchyid
- SET @parent_node = CAST(@ParentId AS hierarchyid)
- SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node
- INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], is_directory, path_locator)
- OUTPUT
- INSERTED.path_locator.ToString()
- VALUES (@Name, 1, @parent_node.GetDescendant(@node, NULL))
- ";
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- return con.Query<string>(sql, new { @Name = name, @ParentId = parentId }).SingleOrDefault();
- }
- }
- catch (Exception)
- {
- return null;
- }
- }
- /// <summary>
- /// 디렉토리 생성(시간으로 이름지정)
- /// </summary>
- /// <param name="con"></param>
- /// <param name="transaction"></param>
- /// <param name="parentId"></param>
- /// <returns></returns>
- public string CreateDirectory(SqlConnection con, SqlTransaction transaction, string parentId)
- {
- try
- {
- var sql = @"
- DECLARE @name nvarchar(100), @parent_node hierarchyid, @node hierarchyid
- SET @parent_node = CAST(@ParentId AS hierarchyid)
- SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node
- SELECT @name = Convert(varchar(10),Getdate(),112) + Replace(Convert(varchar(8),Getdate(),108),':','')
- INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], is_directory, path_locator)
- OUTPUT
- INSERTED.path_locator.ToString()
- VALUES (@name, 1, @parent_node.GetDescendant(@node, NULL))
- ";
- return con.Query<string>(sql, new { @ParentId = parentId }, transaction).SingleOrDefault();
- }
- catch (Exception)
- {
- throw;
- }
- }
- public string CreateDirectory(string parentId)
- {
- try
- {
- var sql = @"
- DECLARE @name nvarchar(100), @parent_node hierarchyid, @node hierarchyid
- SET @parent_node = CAST(@ParentId AS hierarchyid)
- SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node
- SELECT @name = Convert(varchar(10),Getdate(),112) + Replace(Convert(varchar(8),Getdate(),108),':','')
- INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], is_directory, path_locator)
- OUTPUT
- INSERTED.path_locator.ToString()
- VALUES (@name, 1, @parent_node.GetDescendant(@node, NULL))
- ";
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- return con.Query<string>(sql, new { @ParentId = parentId }).SingleOrDefault();
- }
- }
- catch (Exception)
- {
- return null;
- }
- }
- /// <summary>
- /// 디렉토리 생성(루트)
- /// </summary>
- /// <param name="con"></param>
- /// <param name="transaction"></param>
- /// <param name="name"></param>
- /// <returns></returns>
- public string CreateDirectoryToRoot(SqlConnection con, SqlTransaction transaction, string name)
- {
- try
- {
- var sql = @"
- DECLARE @parent_node hierarchyid, @node hierarchyid
- SET @parent_node = hierarchyid::GetRoot()
- SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node
- INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], is_directory, path_locator)
- OUTPUT
- INSERTED.path_locator.ToString()
- VALUES (@Name, 1, @parent_node.GetDescendant(@node, NULL))
- ";
- return con.Query<string>(sql, new { @Name = name }, transaction).SingleOrDefault();
- }
- catch (Exception)
- {
- throw;
- }
- }
- /// <summary>
- /// 파일 업로드
- /// </summary>
- /// <param name="con"></param>
- /// <param name="transaction"></param>
- /// <param name="srcPath"></param>
- /// <param name="parentId"></param>
- /// <returns></returns>
- public Guid UploadFile(SqlConnection con, SqlTransaction transaction, string srcPath, string parentId)
- {
- try
- {
- var sql = @"
- DECLARE @parent_node hierarchyid, @node hierarchyid
- SET @parent_node = CAST(@ParentId AS hierarchyid)
- SELECT @node = MAX(path_locator) FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.GetAncestor(1) = @parent_node
- INSERT INTO DI_FILE.[dbo].[di_backup_file] ([name], file_stream, path_locator)
- OUTPUT
- INSERTED.file_stream.PathName() AS Path,
- INSERTED.stream_id AS StreamId
- VALUES (@Name, @Binary, @parent_node.GetDescendant(@node, NULL))
- ";
- var fileBinary = File.ReadAllBytes(srcPath);
- var insertedFile = con.Query<FileTable>(sql, new { @Name = Path.GetFileName(srcPath), Binary = fileBinary, @ParentId = parentId }, transaction).SingleOrDefault();
- return insertedFile.StreamId;
- }
- catch (Exception)
- {
- throw;
- }
- }
- /// <summary>
- /// 파일 다운로드
- /// </summary>
- /// <param name="con"></param>
- /// <param name="transaction"></param>
- /// <param name="dstPath"></param>
- /// <param name="streamId"></param>
- /// <returns></returns>
- public string DownloadFile(SqlConnection con, SqlTransaction transaction, string dstPath, Guid streamId)
- {
- try
- {
- if (!Directory.Exists(Path.GetDirectoryName(dstPath)))
- {
- Directory.CreateDirectory(Path.GetDirectoryName(dstPath));
- }
- var sql = @"
- SELECT TOP 1
- file_stream AS binary,
- file_stream.PathName() AS Path,
- name
- FROM DI_FILE.[dbo].[di_backup_file]
- WHERE stream_id = @StreamId
- ";
- var file = con.Query<FileTable>(sql, new { @StreamId = streamId }, transaction).SingleOrDefault();
- var tmpDstPath = $@"{Path.GetDirectoryName(dstPath)}\tmp_{Path.GetFileName(dstPath)}";
- File.WriteAllBytes(tmpDstPath, file.Binary);
- return tmpDstPath;
- }
- catch (Exception ex)
- {
- throw;
- }
- }
- /// <summary>
- /// 디렉터리 삭제 (자식노드 포함)
- /// </summary>
- /// <param name="name"></param>
- /// <param name="parentId"></param>
- /// <returns></returns>
- public bool RemoveDirectory(string parentId)
- {
- try
- {
- var sql = @"
- DECLARE @parent_node hierarchyid
- SET @parent_node = CAST(@ParentId AS hierarchyid)
- DELETE FROM DI_FILE.[dbo].[di_backup_file] WHERE path_locator.IsDescendantOf(@parent_node) = 1
- ";
- using (var con = new SqlConnection(App._myConnection))
- {
- con.Open();
- return 0 < con.Execute(sql, new { ParentId = parentId });
- }
- }
- catch (Exception)
- {
- return false;
- }
- }
- }
- }
|