写在前面

最近一直在弄文件传输组件,其中一个功能就是,在接收端接收文件时,如果文件已经存在了,则对其进行文件名+索引的方式进行自动重命名,之前也写个类似的工具类,总感觉代码太冗余,每回头想想,总觉得心里有疙瘩,下班的时候在地铁上,又想了想,感觉是我把问题想复杂了,遂将今天的思路整理一下,写了一个辅助类,记录在此。

上篇文章

[工具类]文件或文件夹xx已存在,则重命名为xx(n)

ReNameHelper代码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.IO;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Text.RegularExpressions;
 7 using System.Threading.Tasks;
 8
 9 namespace Wolfy.ReNameHelper
10 {
11     /// <summary>
12     /// 文件已存在,重命名操作类
13     /// </summary>
14     public class ReNameHelper
15     {
16         /// <summary>
17         /// 对文件进行重命名
18         /// </summary>
19         /// <param name="strFilePath"></param>
20         /// <returns></returns>
21         public static string FileReName(string strFilePath)
22         {
23             //判断该文件是否存在,存在则返回新名字,否则返回原来的名
24             if (!File.Exists(strFilePath))
25             {
26                 return Path.GetFileName(strFilePath);
27             }
28             else
29             {
30                 //获取不带扩展名的文件名称
31                 string strFileNameWithoutExtension = Path.GetFileNameWithoutExtension(strFilePath);
32                 //获取扩展名
33                 string strFileExtension = Path.GetExtension(strFilePath);
34                 //获取目录名
35                 string strDirPath = Path.GetDirectoryName(strFilePath);
36                 //以文件名开头和结尾的正则
37                 string strRegex = "^" + strFileNameWithoutExtension + "(\\d+)?" ;
38                 Regex regex = new Regex(strRegex);
39                 //获取该路径下类似的文件名
40                 string[] strFilePaths = Directory.GetFiles(strDirPath, "*" + strFileExtension).Where(path => regex.IsMatch(Path.GetFileNameWithoutExtension(path))).ToArray();
41                 //获得新的文件名
42                 return strFileNameWithoutExtension + "(" + (strFilePaths.Length + 1).ToString() + ")" + strFileExtension;
43             }
44         }
45         /// <summary>
46         /// 文件夹已存在,重命名
47         /// </summary>
48         /// <param name="strFolderPath"></param>
49         /// <returns></returns>
50         public static string FolderReName(string strFolderPath)
51         {
52             //判断该文件夹是否存在,存在则返回新名字,否则返回原来的名
53             if (!Directory.Exists(strFolderPath))
54             {
55                 return Path.GetFileName(strFolderPath);
56             }
57             else
58             {
59                 //获取文件夹名
60                 string strFolderName= Path.GetFileName(strFolderPath);
61                 //获取目录名
62                 string strDirPath = Path.GetDirectoryName(strFolderPath);
63                 //以文件夹名开头和结尾的正则
64                 string strRegex = "^" + strFolderName + "(\\d+)?";
65                 Regex regex = new Regex(strRegex);
66                 //获取该路径下类似的文件夹名
67                 string[] strFilePaths = Directory.GetDirectories(strDirPath).Where(path => regex.IsMatch(Path.GetFileName(path))).ToArray();
68                 //获得新的文件名
69                 return strFolderName + "(" + (strFilePaths.Length + 1).ToString() + ")" ;
70             }
71         }
72     }
73 }

实现思路:使用正则进行匹配以文件名或者文件夹名字开头的文件或者文件夹名称,获取文件或者文件夹的个数,则新的文件名为文件名(文件或者文件夹总数+1)。当然,对一些,名字比较特殊的,不符合windows命名规则的,在客户端选择文件或者文件夹的时候,尽量对其进行过滤。以保证该辅助类起到应有的作用。

简单测试

在路径C:\Users\Wolfy\Desktop\MVC5下有如上图的一些文件,现在如果再次接收相同名字的文件或者文件夹,则返回新的文件或者文件夹名

结果

这里也分享一个园友写的一个重命名的辅助类。对文件操作的辅助类,记录再次,供大家参考。

原文地址:http://www.cnblogs.com/lxblog/archive/2012/11/13/2768096.html

using System;
using System.Runtime.InteropServices;
using System.IO;namespace LxFile
{/// <summary>/// 文件操作代理,该类提供类似于Windows的文件操作体验/// </summary>public class FileOperateProxy{#region 【内部类型定义】private struct SHFILEOPSTRUCT{public IntPtr hwnd;         //父窗口句柄 public wFunc wFunc;         //要执行的动作 public string pFrom;        //源文件路径,可以是多个文件,以结尾符号"\0"结束public string pTo;          //目标路径,可以是路径或文件名 public FILEOP_FLAGS fFlags;             //标志,附加选项 public bool fAnyOperationsAborted;      //是否可被中断 public IntPtr hNameMappings;            //文件映射名字,可在其它 Shell 函数中使用 public string lpszProgressTitle;        // 只在 FOF_SIMPLEPROGRESS 时,指定对话框的标题。
        }private enum wFunc{FO_MOVE = 0x0001,   //移动文件FO_COPY = 0x0002,   //复制文件FO_DELETE = 0x0003, //删除文件,只是用pFromFO_RENAME = 0x0004  //文件重命名
        }private enum FILEOP_FLAGS{FOF_MULTIDESTFILES = 0x0001,    //pTo 指定了多个目标文件,而不是单个目录FOF_CONFIRMMOUSE = 0x0002,FOF_SILENT = 0x0044,            // 不显示一个进度对话框FOF_RENAMEONCOLLISION = 0x0008, // 碰到有抵触的名字时,自动分配前缀FOF_NOCONFIRMATION = 0x10,      // 不对用户显示提示FOF_WANTMAPPINGHANDLE = 0x0020, // 填充 hNameMappings 字段,必须使用 SHFreeNameMappings 释放FOF_ALLOWUNDO = 0x40,           // 允许撤销FOF_FILESONLY = 0x0080,         // 使用 *.* 时, 只对文件操作FOF_SIMPLEPROGRESS = 0x0100,    // 简单进度条,意味者不显示文件名。FOF_NOCONFIRMMKDIR = 0x0200,    // 建新目录时不需要用户确定FOF_NOERRORUI = 0x0400,         // 不显示出错用户界面FOF_NOCOPYSECURITYATTRIBS = 0x0800,     // 不复制 NT 文件的安全属性FOF_NORECURSION = 0x1000        // 不递归目录
        }#endregion 【内部类型定义】#region 【DllImport】[DllImport("shell32.dll")]private static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);#endregion 【DllImport】#region 【删除文件操作】/// <summary>/// 删除单个文件。/// </summary>/// <param name="fileName">删除的文件名</param>/// <param name="toRecycle">指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除</param>/// <param name="showDialog">指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框</param>/// <param name="showProgress">指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效</param>/// <param name="errorMsg">反馈错误消息的字符串</param>/// <returns>操作执行结果标识,删除文件成功返回0,否则,返回错误代码</returns>public static int DeleteFile(string fileName, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg){try{string fName = GetFullName(fileName);return ToDelete(fName, toRecycle, showDialog, showProgress, ref errorMsg);}catch (Exception ex){errorMsg = ex.Message;return -200;}}/// <summary>/// 删除一组文件。/// </summary>/// <param name="fileNames">字符串数组,表示一组文件名</param>/// <param name="toRecycle">指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除</param>/// <param name="showDialog">指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框</param>/// <param name="showProgress">指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效</param>/// <param name="errorMsg">反馈错误消息的字符串</param>/// <returns>操作执行结果标识,删除文件成功返回0,否则,返回错误代码</returns>public static int DeleteFiles(string[] fileNames, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg){try{string fName = "";foreach (string str in fileNames){fName += GetFullName(str) + "\0";     //组件文件组字符串
                }return ToDelete(fName, toRecycle, showDialog, showProgress, ref errorMsg);}catch (Exception ex){errorMsg = ex.Message;return -200;}}#endregion 【删除文件操作】#region 【移动文件操作】/// <summary>/// 移动一个文件到指定路径下/// </summary>/// <param name="sourceFileName">要移动的文件名</param>/// <param name="destinationPath">移动到的目的路径</param>/// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param>/// <param name="showProgress">指示是否显示进度对话框</param>/// <param name="autoRename">指示当文件名重复时,是否自动为新文件加上后缀名</param>/// <param name="errorMsg">反馈错误消息的字符串</param>/// <returns>返回移动操作是否成功的标识,成功返回0,失败返回错误代码</returns>public static int MoveFile(string sourceFileName, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg){try{string sfName = GetFullName(sourceFileName);string dfName = GetFullName(destinationPath);return ToMoveOrCopy(wFunc.FO_MOVE, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);}catch (Exception ex){errorMsg = ex.Message;return -200;}}/// <summary>/// 移动一组文件到指定的路径下/// </summary>/// <param name="sourceFileNames">要移动的文件名数组</param>/// <param name="destinationPath">移动到的目的路径</param>/// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param>/// <param name="showProgress">指示是否显示进度对话框</param>/// <param name="autoRename">指示当文件名重复时,是否自动为新文件加上后缀名</param>/// <param name="errorMsg">反馈错误消息的字符串</param>/// <returns>返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常</returns>public static int MoveFiles(string[] sourceFileNames, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg){try{string sfName = "";foreach (string str in sourceFileNames){sfName += GetFullName(str) + "\0";   //组件文件组字符串
                }string dfName = GetFullName(destinationPath);return ToMoveOrCopy(wFunc.FO_MOVE, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);}catch (Exception ex){errorMsg = ex.Message;return -200;}}#endregion 【移动文件操作】#region 【复制文件操作】/// <summary>/// 复制一个文件到指定的文件名或路径/// </summary>/// <param name="sourceFileName">要复制的文件名</param>/// <param name="destinationFileName">复制到的目的文件名或路径</param>/// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param>/// <param name="showProgress">指示是否显示进度对话框</param>/// <param name="autoRename">指示当文件名重复时,是否自动为新文件加上后缀名</param>/// <returns>返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常</returns>public static int CopyFile(string sourceFileName, string destinationFileName, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg){try{string sfName = GetFullName(sourceFileName);string dfName = GetFullName(destinationFileName);return ToMoveOrCopy(wFunc.FO_COPY, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);}catch (Exception ex){errorMsg = ex.Message;return -200;}}/// <summary>/// 复制一组文件到指定的路径/// </summary>/// <param name="sourceFileNames">要复制的文件名数组</param>/// <param name="destinationPath">复制到的目的路径</param>/// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param>/// <param name="showProgress">指示是否显示进度对话框</param>/// <param name="autoRename">指示当文件名重复时,是否自动为新文件加上后缀名</param>/// <returns>返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常</returns>public static int CopyFiles(string[] sourceFileNames, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg){try{string sfName = "";foreach (string str in sourceFileNames){sfName += GetFullName(str) + "\0";     //组件文件组字符串
                }string dfName = GetFullName(destinationPath);return ToMoveOrCopy(wFunc.FO_COPY, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);}catch (Exception ex){errorMsg = ex.Message;return -200;}}#endregion 【复制文件操作】#region 【重命名文件】/// <summary>/// 重命名一个文件为新名称,建议您使用更方便的Microsoft.VisualBasic.FileSystem.ReName();替换该方法/// </summary>/// <param name="sourceFileName">要复制的文件名</param>/// <param name="destinationFileName">复制到的目的文件名或路径</param>/// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param>/// <returns>返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常</returns>[Obsolete("建议使用 Microsoft.VisualBasic.FileSystem.ReName()方法")]public static int ReNameFile(string sourceFileName, string destinationFileName, bool showDialog, ref string errorMsg){try{SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT();lpFileOp.wFunc = wFunc.FO_RENAME;lpFileOp.pFrom = GetFullName(sourceFileName) + "\0\0";         //将文件名以结尾字符"\0\0"结束lpFileOp.pTo = GetFullName(destinationFileName) + "\0\0";lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;if (!showDialog)lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION;     //设定不显示提示对话框
lpFileOp.fAnyOperationsAborted = true;int n = SHFileOperation(ref lpFileOp);if (n == 0)return 0;string tmp = GetErrorString(n);errorMsg = string.Format("{0}({1})", tmp, sourceFileName);return n;}catch (Exception ex){errorMsg = ex.Message;return -200;}}/// <summary>/// 利用Microsoft.VisualBasic.FileSystem.ReName()方法实现/// </summary>/// <param name="filePath"></param>/// <param name="newFileName"></param>public static void ReNameFile(string filePath, string newFileName){try{string extensName = Path.GetExtension(filePath);string newName = newFileName + extensName;Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(filePath, newName);}catch (Exception ex){throw ex;}}#endregion 【重命名文件】/// <summary>/// 删除单个或多个文件/// </summary>/// <param name="fileName">删除的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开</param>/// <param name="toRecycle">指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除</param>/// <param name="showDialog">指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框</param>/// <param name="showProgress">指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效</param>/// <param name="errorMsg">反馈错误消息的字符串</param>/// <returns>操作执行结果标识,删除文件成功返回0,否则,返回错误代码</returns>private static int ToDelete(string fileName, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg){SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT();lpFileOp.wFunc = wFunc.FO_DELETE;lpFileOp.pFrom = fileName + "\0";       //将文件名以结尾字符"\0"结束
lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;if (toRecycle)lpFileOp.fFlags |= FILEOP_FLAGS.FOF_ALLOWUNDO;  //设定删除到回收站if (!showDialog)lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION;     //设定不显示提示对话框if (!showProgress)lpFileOp.fFlags |= FILEOP_FLAGS.FOF_SILENT;     //设定不显示进度对话框
lpFileOp.fAnyOperationsAborted = true;int n = SHFileOperation(ref lpFileOp);if (n == 0)return 0;string tmp = GetErrorString(n);//.av 文件正常删除了但也提示 402 错误,不知道为什么。屏蔽之。if ((fileName.ToLower().EndsWith(".av") && n.ToString("X") == "402"))return 0;errorMsg = string.Format("{0}({1})", tmp, fileName);return n;}/// <summary>/// 移动或复制一个或多个文件到指定路径下/// </summary>/// <param name="flag">操作类型,是移动操作还是复制操作</param>/// <param name="sourceFileName">要移动或复制的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开</param>/// <param name="destinationFileName">移动到的目的位置</param>/// <param name="showDialog">指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框</param>/// <param name="showProgress">指示是否显示进度对话框</param>/// <param name="autoRename">指示当文件名重复时,是否自动为新文件加上后缀名</param>/// <param name="errorMsg">反馈错误消息的字符串</param>/// <returns>返回移动操作是否成功的标识,成功返回0,失败返回错误代码</returns>private static int ToMoveOrCopy(wFunc flag, string sourceFileName, string destinationFileName, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg){SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT();lpFileOp.wFunc = flag;lpFileOp.pFrom = sourceFileName + "\0";         //将文件名以结尾字符"\0\0"结束lpFileOp.pTo = destinationFileName + "\0\0";lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMMKDIR; //指定在需要时可以直接创建路径if (!showDialog)lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION;     //设定不显示提示对话框if (!showProgress)lpFileOp.fFlags |= FILEOP_FLAGS.FOF_SILENT;     //设定不显示进度对话框if (autoRename)lpFileOp.fFlags |= FILEOP_FLAGS.FOF_RENAMEONCOLLISION;  //自动为重名文件添加名称后缀
lpFileOp.fAnyOperationsAborted = true;int n = SHFileOperation(ref lpFileOp);if (n == 0)return 0;string tmp = GetErrorString(n);errorMsg = string.Format("{0}({1})", tmp, sourceFileName);return n;}/// <summary>/// 获取一个文件的全名/// </summary>/// <param name="fileName">文件名</param>/// <returns>返回生成文件的完整路径名</returns>private static string GetFullName(string fileName){FileInfo fi = new FileInfo(fileName);return fi.FullName;}/// <summary>/// 解释错误代码/// </summary>/// <param name="n">代码号</param>/// <returns>返回关于错误代码的文字描述</returns>private static string GetErrorString(int n){if (n == 0) return string.Empty;switch (n){case 2:return "系统找不到指定的文件。";case 7:return "存储控制块被销毁。您是否选择的“取消”操作?";case 113:return "文件已存在!";case 115:return "重命名文件操作,原始文件和目标文件必须具有相同的路径名。不能使用相对路径。";case 117:return "I/O控制错误";case 123:return "指定了重复的文件名";case 116:return "The source is a root directory, which cannot be moved or renamed.";case 118:return "Security settings denied access to the source.";case 124:return "The path in the source or destination or both was invalid.";case 65536:return "An unspecified error occurred on the destination.";case 1026:return "在试图移动或拷贝一个不存在的文件.";case 1223:return "操作被取消!";default:return "未识别的错误代码:" + n;}}}
}

View Code

总结

通过这个工具类的改写,发现实现一个功能,有很多方法,有时候换个思路,代码也许会更简洁,逻辑更清晰。

转载于:https://www.cnblogs.com/wolf-sun/p/4229945.html

[工具类]文件或文件夹xx已存在,则重命名为xx(n)(2)相关推荐

  1. 解决spring的读取文件的工具类来获取文件等操作

    今天项目又遇到了,,,读取项目下文件的情况下. 其实这个挺头疼的,,,特别是 Java web项目 下的方式和 Java 项目 下 读取文件的相对路径是有点区别的...所以感觉挺不好搞的... 而且 ...

  2. 学习日志day41(2021-09-03)(1、文件的上传 2、文件的查看 3、文件的下载 4、使用工具类上传文件 5、基于servlet3.0以上的文件上传 )

    学习内容:学习JavaWeb(Day41) 1.文件的上传 2.文件的查看 3.文件的下载 4.使用工具类上传文件 5.基于servlet3.0以上的文件上传 1.文件的上传 (1)实现文件的上传需要 ...

  3. Java常用工具类---IP工具类、File文件工具类

    package com.jarvis.base.util; import java.io.IOException; import java.io.InputStreamReader; import j ...

  4. java filehelper_Java常用工具类---IP工具类、File文件工具类

    package com.jarvis.base.util; import java.io.IOException; import java.io.InputStreamReader; import j ...

  5. 【工具类】分布式文件存储-FastDFS

    FastDFS简介 FastDFS体系结构 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡 ...

  6. Java常用工具类(六):文件、资源、IO流工具类

    1. 文件工具类 1.1 FileCopyUtils 输入 // 从文件中读入到字节数组中 byte[] copyToByteArray(File in) // 从输入流中读入到字节数组中 byte[ ...

  7. 对象存储Minio 客户端工具类,实现文件上传、图像压缩、图像添加水印

    在搭建好了MInio分布式对象存储集群后,官方提供了MInio Client 各类语言的SDK,但是无法直接使用需要进一步封装,这里将JAVA 版的的SDK结合自身业务做个简单封装. Minio 中文 ...

  8. java工具类之大文件分片(切割)与合并

    之前在潭州教育教学网站上看了一个视频关于java大文件的分片与合并 自己在练习的时候遇到一些坑,调试了好长时间 代码如下: 首先配置一个专门放参数的类 SplitFileParam public cl ...

  9. 将文件上传至ftp服务器,FTP文件上传工具类,将文件上传至服务器指定目录

    将文件上传至ftp服务器,传入File对象,将文件上传至ftp服务器 需要配置修改的点: 1. 服务器ip端口(服务器ip 端口22/21). 2. 服务器账号密码(服务器登录用户名密码). 3. 上 ...

最新文章

  1. include,require,include_once,require_once区别
  2. 行波和驻波动画演示gif_新技能get√ | 语文课上的笔顺动画可以这么做
  3. Ubuntu系统如何卸载并安装新版本的jdk(permission denied问题)
  4. 简颢集团“风口”下的投资机会 新能源共享领域的机遇与挑战
  5. 【Linux】sudo用户权限管理
  6. [POI2011]MET-Meteors 整体二分_树状数组_卡常
  7. 使用python的docker-py实现docker的api操作
  8. 【Spring】一次线上@Transational事务注解未生效的原因探究
  9. 取消搜索状态_百度搜索引擎全网推广通常有哪些账户?
  10. linux批量文件编码转换,Linux系统批量转换文件编码脚本
  11. 数据库中的DbUtils
  12. AdvancedInstaller.com 命令行参数
  13. 数字地球各类贴图资源下载地址
  14. 如何使用Arduino 舵机SG90
  15. matlab开始如何设置,MATLAB 2018B: 如何创建快捷方式
  16. Android - 一种相似图片搜索算法的实现
  17. 如何在Word中输入带方框对勾
  18. 算法小讲堂之B树和B+树(浅谈)|考研笔记
  19. Swift MD5加密
  20. numpy之vstack()、hstack()

热门文章

  1. python中属于有序序列的有_Python中的有序序列有哪些
  2. 请求失败或服务器为及时响应,SQLServer(MSSQLSERVER)请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。...
  3. win32 sdk C语言菜单,win32 sdk 设定/获取checkbox控件状态
  4. rdlc报表 矩形高固定_固定资产管理系统_简化资产管理流程
  5. 计算方法c语言上机作业,考研复试-----C语言上机操作(三)
  6. 计算机专业学生创新创优创业情况,高校计算机专业学生创新创业教育模式研究...
  7. php rpoplpush,Redis Rpoplpush 命令
  8. java thread.notify_Java Thread notify()方法
  9. transformers PreTrainedTokenizer
  10. Ansible Synopsis