using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;//openfiledialog
using System.IO;//文本处理 namespace CutTxt
{
public partial class mainForm : Form
{
string fileLocation = "";//文件的位置
long fileLenth = 0;//文件的大小(字节)
int fileLines = 0;//文本内容的行数
int setLines = 0;//自定义的行
int page = 0;//分割的页数 public mainForm()
{
InitializeComponent();
} //浏览按钮的事件
private void bt_browseFile_Click(object sender, EventArgs e)
{ OpenFileDialog open1 = new OpenFileDialog();
open1.InitialDirectory = "C:\\";
open1.Filter = "文本文件 (*.txt)|*.txt|All files (*.*)|*.*";
open1.FilterIndex = 1;
open1.RestoreDirectory = false; if (open1.ShowDialog() == DialogResult.OK)
{
fileLocation = open1.FileName;
tb_fileLocation.Text = fileLocation;
tb_lineNumber.Enabled = true;
tb_lineNumber.Text = "";
fileLines = getTxtProperty(tb_fileLocation.Text);
//获取文件大小
FileInfo file1 = new FileInfo(tb_fileLocation.Text);
fileLenth = file1.Length;
lb_txtProperty.Text = "文章段落数:【" + fileLines.ToString()+ "】 段," + "文件大小:【" + fileLenth.ToString() + " 】字节。"; } } //分割按钮的事件
private void bt_cutFiles_Click(object sender, EventArgs e)
{
if (tb_fileLocation.Text == "")
{
MessageBox.Show("请指定文件路径!");
}
else if (tb_lineNumber.Text == "")
{
MessageBox.Show("请设置分割的行数!");
}
else
{
cutTxt(fileLocation, int.Parse(tb_lineNumber.Text));
}
} //得到行数
public int getTxtProperty(string fileLocation)
{
StreamReader sr = new StreamReader(fileLocation); string aa = "";
int bb = 0;
while ((aa = sr.ReadLine()) != null)
{
bb++;
}
return bb;
} //开始分割
public void cutTxt(string fileLocation, int lineNumbers)
{
string [] recordLine = new string[fileLines];//定义行数大小的数组
int ii = 0;
string tmpLine = ""; StreamReader sr = new StreamReader(fileLocation,Encoding.GetEncoding("gb2312"));
while ((tmpLine = sr.ReadLine()) != null)
{
recordLine[ii] = tmpLine;
ii++;
}
//开始处理分割
int curLine = 0;//工作行
int curPage=0;//当前工作篇
for (int p = 0; p < page-1; p++)//先写前n篇,最后一篇单独写
{
StreamWriter sw = new StreamWriter("Xiangjun"+p+".txt", true, Encoding.GetEncoding("gb2312"));
for (int j = curLine; j < curLine+setLines; j++)
{
sw.Write(recordLine[j]);
sw.Write("\r\n");//写完一行后换行
}
sw.Flush();
sw.Close();
curLine += setLines;
curPage=p;
//MessageBox.Show("当前索引:" + curLine+"当前page值:"+curPage);
}
//写最后一篇
StreamWriter sw_Last = new StreamWriter("Xiangjun" + (curPage+1) + ".txt", true, Encoding.GetEncoding("gb2312"));
for (int j = curLine; j < fileLines; j++)
{
sw_Last.Write(recordLine[j]);
sw_Last.Write("\r\n");//写完一行后换行
//MessageBox.Show("当前索引:" + j);
}
sw_Last.Flush();
sw_Last.Close();
MessageBox.Show("分割成功!"); } //当设置的行数更改时,记录其数值
//设置文本框失效事件,在form1.Designer.cs中
private void tb_lineNumber_LostFocus(object sender, EventArgs e)
{
//定义未使用
} private void tb_lineNumber_TextChanged(object sender, EventArgs e)
{
setLines = int.Parse(tb_lineNumber.Text);
if (setLines != 0)
{
page = (fileLines / setLines) + 1;//获取篇数
lb_pageNum.Text = "您设置了【" + setLines + "】段为一页,预计将产生【" + page + "】个文件。";
}
else
{
lb_pageNum.Text = "无法设置0个段落!";
} } private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start("mailto:liuxiangjun@188.com");
} }
}

实验要求:
1. 能进行文件分割
2. 分割块大小由用户输入决定
3. 能进行文件合并
4. 文件分割与合并过程用线程来实现
5. 数据缓冲区不得超过2K
6. 要有处理进度显示

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading; namespace WindowsFormsApplication1
{
public partial class 文件分割器1 : Form
{
//时间:2012-9-6
//作者:Olive
//功能:实现大文件的分割、合并
#region Members
int count1,count,fgkDaXiao;
FileInfo fFenGe,fHeBing;
FileStream fStream,hStream;
string fenGeLuJing,heBingLuJing;
int value = 0;
#endregion #region Methods
public 文件分割器1()
{
InitializeComponent();
skinEngine1.SkinFile = "WarmColor1.ssk";
} /// <summary>
/// 选择要分割的文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnfgwenjian_Click(object sender, EventArgs e)
{
try
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
fFenGe = new FileInfo(openFileDialog1.FileName);
txtfenge.Text = fFenGe.FullName; fenGeLuJing = fFenGe.FullName.Substring(0, fFenGe.FullName.Length - openFileDialog1.SafeFileName.Length);
txtwjdaxiao.Text = ((int)fFenGe.Length/1024).ToString();
fStream = new FileStream(fFenGe.FullName, FileMode.Open, FileAccess.Read);
}
}
catch
{
MessageBox.Show("文件分割异常,请检查确认无误后再次分割!");
} }
/// <summary>
/// 选择要保存的路径,如果不选默认为与原文件同路径
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnfglujing_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txtfgkdaxiao.Text))
{
MessageBox.Show("请输入文件分割块大小!");
}
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
txtfglujing.Text= folderBrowserDialog1.SelectedPath;
fenGeLuJing = folderBrowserDialog1.SelectedPath+"\\";
}
}
/// <summary>
/// 分割文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnfenge_Click(object sender, EventArgs e)
{
try
{
int wenJianLength = Convert.ToInt32(txtwjdaxiao.Text); if (wenJianLength % fgkDaXiao == 0)
{
count = wenJianLength / fgkDaXiao;
}
else
{
count = wenJianLength / fgkDaXiao + 1;
}
for (int i = 0; i < count; i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(FenGe));
thread.Start(i);
}
MessageBox.Show("文件分割完毕");
}
catch
{
MessageBox.Show("分割异常,请确认操作!");
}
}
/// <summary>
/// 分割线程调用函数
/// </summary>
/// <param name="i"></param>
public void FenGe(object i)
{ try
{
using (FileStream fgstream = new FileStream(fenGeLuJing + fFenGe.Name.Substring(0, fFenGe.Name.Length - fFenGe.Extension.Length) + i + fFenGe.Extension, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] buffer = new byte[fgkDaXiao * 1024];
int data = 0;
if ((data = fStream.Read(buffer, 0, buffer.Length)) > 0)
{
BinaryWriter bWriter = new BinaryWriter(fgstream, Encoding.Default);
bWriter.Write(buffer, 0, data);
value=(int)i/count*100;
progressBar1.Value = value;
} }
}
catch
{
MessageBox.Show("文件打开异常!");
} }
/// <summary>
/// 输入值变化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtfgkdaxiao_TextChanged(object sender, EventArgs e)
{
if (txtfgkdaxiao.Text.Length > 0)
{
fgkDaXiao = Convert.ToInt32(txtfgkdaxiao.Text);
}
}
/// <summary>
/// 选择要合并的文件,首个分割文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnhbwenjian_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
fHeBing = new FileInfo(openFileDialog1.FileName);
txthebing.Text = fHeBing.FullName;
heBingLuJing = fHeBing.FullName.Substring(0, fHeBing.FullName.Length - openFileDialog1.SafeFileName.Length) + "\\";
}
}
/// <summary>
/// 选择合并后的文件的保存路径
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnhebinglujing_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
heBingLuJing = folderBrowserDialog1.SelectedPath + "\\";
}
}
/// <summary>
/// 合并文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
try
{
if (count1 > 0)
{
using (hStream = new FileStream(heBingLuJing + fHeBing.Name.Substring(0, fHeBing.Name.Length - fHeBing.Extension.Length - 1) + fHeBing.Extension, FileMode.OpenOrCreate, FileAccess.Write))
{
for (int i = 0; i < count1; i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(HeBing));
thread.Start(i);
} MessageBox.Show("合并完成");
}
}
else
{
MessageBox.Show("请输入合并文件数目");
}
}
catch
{
MessageBox.Show("合并异常,请重新合并");
}
}
/// <summary>
/// 求要合并的文件数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txthbkuaishu_TextChanged(object sender, EventArgs e)
{
count1 = Convert.ToInt32(txthbkuaishu.Text);
}
/// <summary>
/// 合并线程调用的合并函数,执行文件合并
/// </summary>
/// <param name="i"></param>
public void HeBing(object i)
{
using (FileStream readStream = new FileStream(fHeBing.FullName.Substring(0, fHeBing.FullName.Length - fHeBing.Extension.Length- 1) + i + fHeBing.Extension, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[readStream.Length];
int data = 0;
if ((data = readStream.Read(buffer, 0, buffer.Length)) > 0)
{
BinaryWriter binary = new BinaryWriter(hStream, Encoding.Default);
binary.Write(buffer, 0, data);
}
}
}
#endregion
}
} 本文主要用到了FileStream、FileInfo类、BinaryWriter、StreamReader、StreamWriter等常用文件操作类,而且还用到了线程的知识,如果有不懂的地方,希望可以和我交流,共同学习进步

C#txt文本分割器的更多相关文章

  1. opencv从txt文本读取像素点并显示

    opencv从txt文本读取像素点并显示 文本储存格式为每行一个像素点,排列为RGB.每帧图像的帧头为65535.  如下图所示 废话不多说,代码如下: // #include <iostrea ...

  2. Python 文本解析器

    Python 文本解析器 一.课程介绍 本课程讲解一个使用 Python 来解析纯文本生成一个 HTML 页面的小程序. 二.相关技术 Python:一种面向对象.解释型计算机程序设计语言,用它可以做 ...

  3. 用C#实现的两个试验编程(txt文本数据的导入,和数据导出为TXT)

    1. 文件的存取 数据文件1.txt为学生成绩统计表,要对它做一个统计工作.文件中若一个人有多个成绩,则取他们的最好成绩来统计,然后计算全班平均成绩:统计0-69.70-79.80-89.90-100 ...

  4. python3 - 文本读音器

    本篇分享的是使用python3制作一个文本读音器,简单点就是把指定的文本文字转语音说出来:做这么个小工具主要是为了方便自己在平时看一些文章眼累的时候,可通过语音来帮助自己,当然如果你是小说迷,可以扩展 ...

  5. 记录EXCEL格式和TXT文本格式之间的互转

    EXCEL格式转变成TXT文本格式 1.打开execl文档,点击文件另存为 2.选择txt保存 3.重命名文档,打开该txt文档 4.按Ctrl+H,将文档中空格转换成其他分割符,单击确定 TXT格式 ...

  6. 将txt文本转换为excel格式

    将txt文本转换为excel格式,中间使用的列分割为 tab 键 一.使用xlwt模块 注:Excel 2003 一个工作表行数限制65536,列数限制256 需要模块:xlwt 模块安装:xlwt ...

  7. 基于Core Text实现的TXT电子书阅读器

    本篇文章的项目地址基于Core Text实现的TXT电子书阅读器. 最近花了一点时间学习了iOS的底层文字处理的框架Core Text.在网上也参考很多资料,具体的资料在文章最后列了出来,有兴趣的可参 ...

  8. 从txt文本内读取数据(逐行读取),执行循环

    如下图,名称为1.txt的文本文件内有链接若干条,预期是循环读取txt文本内链接,而后访问该链接 脚本如下: for line in open('C:\\Users\\Beckham\\Desktop ...

  9. sql中的Bulk 导入txt文本

    通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下.   其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...

随机推荐

  1. flutter Could not find the built application bundle

    报错信息Could not find the built application bundle at build/ios/iphoneos/Runner.app. Error launching ap ...

  2. 探索Redis设计与实现4:Redis内部数据结构详解——ziplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  3. Linux环境下Eclipse对C++新特性的支持设置

    Linux环境下Eclipse对C++新特性的支持设置     今天写一个简单的关于C11中的array容器的测试程序如下, #include <iostream> #include &l ...

  4. 搭建Linux C语言开发环境

    1.操作系统 Windows操作系统:windows 7 and windows 10 2.开发工具和编译工具 开发工具:notpad++ 和 vim 编译工具:Cygwin64 Terminal 3 ...

  5. (6)C++ 函数

    一.基本知识  1.为什么需要原型? 原型描述了函数到编译器的接口,将函数返回值类型以及参数类型.参数数量告诉编译器. 首先原型告诉编译器方法存在某些参数,如果没有原型会让编译器捕获这种错误. 其次函 ...

  6. python requests方法post请求json格式处理

    方法如下: import requestsimport json data = {    'a': 123,    'b': 456} ## headers中添加上content-type这个参数,指 ...

  7. processing模拟三角级数合成方波过程

    代码 1: int radius = 2; 2: int[] accumys; 3: int times = 0; 4: 5: float scale = 1; 6: int origin = 400 ...

  8. shell 过滤器(管道)

    将几个命令通过管道符组合在一起就是一个管道,通常,通过这种方式使用的命令就被称为过滤器. 过滤器会获得输入,通过某种方式修改其内容,然后将其输出. 常用的被用作过滤器使用的命令为: 1.awk---用 ...

  9. python基础【第七篇】

    字典 列表可以存储大量的数据类型,但是只能按照顺序存储,数据与数据之间关联性不强. 所以咱们需要引入一种容器型的数据类型,解决上面的问题,这就需要dict字典. 字典(dict)是python中唯⼀的 ...

  10. loj6626 幼儿园唱歌题

    题目 不难想到把\(S\)的反串\(S^R\)接到\(S\)后面,这样就可以把\(S[l_1,r_1]\)的前缀转化为\(S^R[n-r_1+1,n-l_1+1]\)的后缀 回文树上两节点的lca就是 ...