文件队列处理工具

Posted krockey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件队列处理工具相关的知识,希望对你有一定的参考价值。

文件队列

写了一个文件队列处理的小工具。

    /// <summary>
    /// 文件队列工具。
    /// </summary>
    public class FileQueueTool
    {
        /// <summary>
        /// 将文件加入到本地队列。
        /// </summary>
        /// <param name="queueDir">文件夹。</param>
        /// <param name="fileName">文件名。</param>
        /// <param name="fileContent">内容。</param>
        public static void AddFileToQueue(string queueDir, string fileName, string fileContent)
        {
            var saveDir = GetSaveDir(queueDir);
            if (!Directory.Exists(saveDir))
                Directory.CreateDirectory(saveDir);

            var savePath = Path.Combine(saveDir, fileName);

            string tempFilePath = string.Format(@"{0}.bak", savePath);
            using (var fs = new FileStream(tempFilePath, FileMode.Create, FileAccess.ReadWrite))
            {
                using (var sw = new StreamWriter(fs))
                {
                    sw.Write(fileContent);
                }
            }
            File.Copy(tempFilePath, savePath, true);
            File.Delete(tempFilePath);
        }

        /// <summary>
        /// 从队列中移除文件。
        /// </summary>
        public static void RemoveFileFromQueue(string filePath)
        {
            File.Delete(filePath);
        }

        /// <summary>
        /// 从队列中移除文件。
        /// </summary>
        public static void RemoveFileFromQueue(FileInfo fileInfo)
        {
            File.Delete(fileInfo.FullName);
        }

        /// <summary>
        /// 获取文件。
        /// </summary>
        public static List<FileInfo> GetFilesFromQueue(string queueDir, int takeCount, string type = "")
        {
            var items = new List<FileInfo>();
            if (!Directory.Exists(queueDir))
                return items;

            DirectoryInfo homeDir = new DirectoryInfo(queueDir);
            DirectoryInfo[] dirs = homeDir.GetDirectories().OrderBy(p => Convert.ToInt32(p.Name)).ToArray();
            for (int i = 0; i < dirs.Length; i++)
            {
                DirectoryInfo dir = dirs[i];
                var fileInfos = !string.IsNullOrEmpty(type) ? dir.GetFiles(type) : dir.GetFiles();

                if (fileInfos.Length == 0)
                {
                    //做一个队列延迟
                    if (dir.CreationTime < DateTime.Now.AddMinutes(-2))
                    {
                        var files = dir.GetFiles();
                        if (files.Length == 0)
                            Directory.Delete(dir.FullName, false);
                        else
                        {
                            foreach (var file in files)
                            {
                                if (file.Name.EndsWith(".data"))
                                    continue;

                                if (file.Name.EndsWith(".bak"))
                                {
                                    file.MoveTo(file.FullName.Replace(".bak", ""));
                                }
                            }
                        }
                    }
                }


                foreach (var fileInfo in fileInfos)
                {
                    items.Add(fileInfo);
                    if (items.Count >= takeCount)
                        return items;
                }
            }


            return items;
        }

        /// <summary>
        /// 读取文件内容。
        /// </summary>
        public static T ReadObjectFromQueue<T>(string filePath)
        {
            T t = default(T);

            var fi = new FileInfo(filePath);
            if (fi.Exists)
            {
                using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    string content;
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        content = sr.ReadToEnd();
                    }
                    if (!string.IsNullOrEmpty(content))
                    {
                        t = JsonConvert.DeserializeObject<T>(content);
                    }
                    fs.Close();
                }
            }

            return t;
        }

        /// <summary>
        /// 读取文件内容。
        /// </summary>
        public static string ReadStringFromQueue(string filePath)
        {
            string content = "";

            var fi = new FileInfo(filePath);
            if (fi.Exists)
            {
                using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        content = sr.ReadToEnd();
                    }
                    fs.Close();
                }
            }
            return content;
        }

        public static DirectoryInfo[] GetQueueDirs(string queueDir)
        {
            DirectoryInfo homeDir = new DirectoryInfo(queueDir);
            return homeDir.GetDirectories();
        }

        private static string GetSaveDir(string queuePath)
        {
            if (!Directory.Exists(queuePath))
            {
                Directory.CreateDirectory(queuePath);
            }
            return Path.Combine(queuePath, DateTime.Now.ToString("yyMMddHHmm"));
        }
    }

以上是关于文件队列处理工具的主要内容,如果未能解决你的问题,请参考以下文章

# Java 常用代码片段

Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段

完全下载文件时,将下载的文件从一个片段传递到另一个片段

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

python常用代码片段总结