C#:文件、文件夹特别操作
1、过滤特殊字符
public class CharService:IDisposable
{
private List<char> _invalidChars;
public CharService()
{
_invalidChars = new List<char>();
_invalidChars.AddRange(Path.GetInvalidFileNameChars());
_invalidChars.AddRange(Path.GetInvalidPathChars());
} /// <summary>
/// 特殊字符过滤
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public string SplitStringInvaild(string str,bool isLower=true)
{
str = ToDBC(str);
StringBuilder sb = new StringBuilder();
foreach (char c in str)
{
if (_invalidChars.Contains(c))
continue; if(isLower)
sb.Append(ToLower(c));
else
sb.Append(c);
}
str = sb.ToString().Trim();
if (isLower)
{
if (str.Substring(str.Length-,)==".")
{
str = str.Substring(, str.Length - );
}
}
return str;
} public static char ToLower(char c)
{
if (('A' <= c) && (c <= 'Z'))
{
c = (char)(c | ' ');
}
return c;
} public static String ToDBC(String input)
{
char[] c = input.ToCharArray();
for (int i = ; i < c.Length; i++)
{
if (c[i] == )
{
c[i] = (char);
continue;
}
if (c[i] > && c[i] < )
c[i] = (char)(c[i] - );
}
return new String(c);
} public void Dispose()
{
_invalidChars = null;
}
}
2、将DataTable数据保存为.csv文件
private bool DataTableToCsv(System.Data.DataTable tb, string FileName)
{
bool Export = false;
TextWriter writer = null;
try
{
string text = String.Empty;
// 使用指定编码和缓冲区大小,为指定路径上的指定文件初始化 StreamWriter 类的新实例。
// 如果该文件存在,则可以将其覆盖或向其追加。如果该文件不存在,则此构造函数将创建一个新文件。
writer = new StreamWriter(FileName, false, Encoding.UTF8); // 取得列的个数
int count = tb.Columns.Count;
string[] fields = new string[count];
// 循环添加列名
for (int i = ; i < count; i++)
{
DataColumn column = tb.Columns[i]; fields[i] = column.ColumnName; }
text = string.Join(",", fields);
writer.WriteLine(text);
// 遍历行
foreach (DataRow row in tb.Rows)
{
// 给每一行添加列单元
for (int i = ; i < count; i++)
{
if (row[i] == null)
{
fields[i] = String.Empty;
continue;
}
if (row[i] == DBNull.Value)
{
fields[i] = String.Empty;
continue;
}
string field = row[i].ToString();
// CSV格式有规定,比如,如果字段中有逗号、双引号、回车换行符、前或后置空格,
// 必须把字段用双引号扩起来,如果文本中有双引号,必须用两个双引号替换
field = field.Replace("\"", "\"\"");
if (field.IndexOf(',') >= )
{
fields[i] = string.Format("\"{0}\"", field);
continue;
}
if (field.IndexOf('\r') >= )
{
fields[i] = string.Format("\"{0}\"", field);
continue;
}
if (field.IndexOf('\n') >= )
{
fields[i] = string.Format("\"{0}\"", field);
continue;
}
if (field.IndexOf('\"') >= )
{
fields[i] = string.Format("\"{0}\"", field);
continue;
}
if (field != field.Trim())
{
fields[i] = string.Format("\"{0}\"", field);
continue;
}
fields[i] = (i == ) ? DateTime.Parse(row[i].ToString()).ToString("yyyy/MM/dd HH:mm:ss") : row[i].ToString();
}
text = string.Join(",", fields);
writer.WriteLine(text);
}
_logServ.Debug("导出成功");
//Console.WriteLine("导出成功", "提示");
Export = true;
}
catch (Exception ex)
{
_logServ.Error("导出失败" + ex.Message);
// Console.WriteLine("导出失败" + ex.Message, "提示");
Export = false;
}
finally
{
if (writer != null)
{
writer.Close();
}
}
return Export;
}
3、+过滤掉非法字符
/// <summary>
/// 过滤掉非法字符和点字符
/// </summary>
/// <param name="directoryName"></param>
/// <returns></returns>
public String DirectoryNameFilter(String directoryName)
{
string invalidChars = "\\/:*?\"<>|."; //自定义非法字符(比系统的多了个.)
foreach (char c in invalidChars)
{
directoryName.Replace(c.ToString(), string.Empty);
}
return directoryName;
} /// <summary>
/// 过滤掉非法字符
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public String NameFilter(String name)
{
string invalidChars = "\\/:*?\"<>|"; //自定义非法字符(比系统的多了个.)
foreach (char c in invalidChars)
{
name.Replace(c.ToString(), string.Empty);
}
return name;
}
4、计算文件夹大小
#region 计算文件夹大小 /// <summary>
/// 计算文件夹大小
/// </summary>
/// <param name="dirPath">文件夹</param>
/// <returns></returns>
public long CalculateDirSize(string dirPath)
{
long sumSize = ;
try
{
if (!Directory.Exists(dirPath))
{
DirectoryInfo dirInfo = new DirectoryInfo(dirPath);
FileInfo[] files = dirInfo.GetFiles();
foreach (FileInfo fInfo in files)
{
sumSize += fInfo.Length;
}
DirectoryInfo[] dirs = dirInfo.GetDirectories();
foreach (DirectoryInfo dInfo in dirs)
{
sumSize += CalculateDirSize(dInfo.FullName);
}
}
}
catch (Exception ex)
{
LogHelper.Instance.Error("计算文件夹大小(" + dirPath + ")出错:" + ex.Message);
}
return sumSize;
}
C#:文件、文件夹特别操作的更多相关文章
- QT文件(夹)操作---QFile、QDir、QFileInfo、QTextStream和QDataStream异同
1.1 文件和目录 QFile.QBuffer和QTcpSocket可支持读写设备,用open函数打开,用write或putChar函数写入.用read和readLine或readAll进行读取 ...
- java io流 对文件夹的操作
java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...
- Sharepoint中有关文件夹的操作
1.GetItemsWithUniquePermissions根据返回数量和是否返回文件夹获取唯一权限的列表项集合 对于SharePoint对象模型中SPList的GetItemsWithUnique ...
- 用C#操作文件/文件夹(删除,复制,移动)
操作某一个文件/文件夹,需要一个文件的完整路径 一.使用File的静态方法进行文件操作 //使用file的静态方法进行复制 File.Copy(path, destpath); //使用File的静态 ...
- python之文件的读写和文件目录以及文件夹的操作实现代码
这篇文章主要介绍了python之文件的读写和文件目录以及文件夹的操作实现代码,需要的朋友可以参考下 为了安全起见,最好还是给打开的文件对象指定一个名字,这样在完成操作之后可以迅速关闭文件,防止一些无用 ...
- Qt: 文件、文件夹的操作;
Qt没有提供单独的函数来对文件.文件夹进行操作, 但是提供了两个类: QFile, QDir; 1.文件操作 ) 文件是否存在: QFile file("D:/test.jpg") ...
- JAVA文件操作类和文件夹的操作代码示例
JAVA文件操作类和文件夹的操作代码实例,包括读取文本文件内容, 新建目录,多级目录创建,新建文件,有编码方式的文件创建, 删除文件,删除文件夹,删除指定文件夹下所有文件, 复制单个文件,复制整个文件 ...
- python 关于文件夹的操作
在python中,文件夹的操作主要是利用os模块来实现的, 其中关于文件夹的方法为:os.lister() , os.path.join() , os.path.isdir() # path 表示文 ...
- java文件夹相关操作 演示样例代码
java文件夹相关操作 演示样例代码 package org.rui.io; import java.io.File; import java.io.FilenameFilter; import ja ...
随机推荐
- javaEE开发案例——购物车
一.页面 流程:登录页面(login.jsp)——>购物大厅页面(hall.jsp)——>购物车页面(showMyCart.jsp)——>订单页面(myorder.jsp)——> ...
- loadview 方法调用
从官方文档看 不应该直接调用此方法,当控制器当前的view为空的时候,这个方法就会被调用,并且会创建一个空白的view,如果viewcontroller绑定了storyboard或者xib就不用说了. ...
- 查找文件并执行的shell命令
来由 经常我们需要找到某类文件, 并对进行处理. 例如找到.svn文件夹, 然后删除掉. 如果不使用shell,你可以选择手动删除, 前提是没有几个此类文件, 但是svn信息文件很多, 不能采用手动删 ...
- 磁盘io负载查看
转自:http://blog.csdn.net/i_am_jojo/article/details/7698458 为了方便各位和自己今后遇到此类问题能尽快解决,我这里将查看linux服务器硬盘IO访 ...
- C# (事件触发)回调函数,完美处理各类疑难杂症!
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客! 废话说多了...... 嘿嘿:本篇标题为:C# (事件触发)回调函数,完美处理各类疑难杂症.个人理解如下:事件触发也就是触 ...
- Protostuff序列化
前言: Java序列化是Java技术体系当中的一个重要议题,序列化的意义在于信息的交换和存储,通常会和io.持久化.rmi技术有关(eg:一些orm框架会要求持久化的对象类型实现Serializabl ...
- !!常见的上穿突破M20方式——突破还是试探的判断
1和2相似之处在于M5<M20, 最大的区别是M20和M5之间的间距在放大还是缩小,如果是放大,大盘会先试探一下.如果越缩越小,大盘必须选择方向 但是必须注意的是,即使是夹角缩小,选在方向不一定 ...
- cookie 使用笔记
参考书<JSP Web 开发案例教程> index.jsp页面 dologin.jsp页面 welcome.jsp页面 页面显示 点击提交
- 【Origin】 叹文
行文如流水, 千字挥手就: 偏偏伤脑筋, 哪得轻松事. -作于二零一五年五月三十日
- maven的中传递依赖,maven的依赖管理(转)
在maven的pom文件中 <dependencies> <dependency> <groupId>junit</groupId> <artif ...