将文本文件修剪为所需长度

时间:2011-04-14 14:12:30

标签: c# file-io

如何编写一个将文本文件大约修剪为所需大小(以字节为单位)的函数?该文件是一个以换行符分隔的列表,我想在元素之间修剪它,而不是在它们内部。

编辑:示例文件

element one
element two
third element
hello
final element

我想以元素保持完整的方式切断文件,例如不喜欢这样:

element one
element two
third element
he

但是这样(即使它意味着大小不会完全等于参数):

element one
element two
third element

3 个答案:

答案 0 :(得分:0)

    public static void TrimTextFile(string fileName, long sizeInByte)
    {
        using(FileStream fs = new FileStream(fileName, FileMode.Open))
        {
            fs.Position = sizeInByte;
            int byteRead = 0;
            while ((byteRead = fs.ReadByte()) >= 0)
            {
                if(byteRead == 13)
                {
                    fs.SetLength(fs.Position - 1);
                    break;

                }
            }
        }
    }

答案 1 :(得分:0)

此示例代码将继续读取将它们再次写入另一个文件的行,直到指定的最大文件大小。它将每个读取行转换为所需的字符编码,以确定其长度(以字节为单位)。

代码是在没有编译检查的情况下编写的。

var input = new FileStream(inputFilename, FileMode.Open);
var output = new FileStream(outputFilename, FileMode.Create);
var reader = new StreamReader(input);
var writer = new BinaryWriter(output);
var data = reader.ReadLine();
var maxSize = 10000;
var totalLength = 0;
while (!string.IsNullOrWhitespace(data) && totalLength < maxSize)
{
  var bytes = System.Text.UnicodeEncoding.GetBytes(data);
  totalLength += bytes.GetLength(0);
  if totalLength < maxSize) writer.Write(bytes);
  data = reader.ReadLine();
}
writer.Flush();
writer.Close();
reader.Close();

答案 2 :(得分:0)

这将读取所需的长度,然后将其修剪到最后一个换行符:

 protected static string GetString(string filename, int contentLength)
    {
        string retString;
        using (FileStream fs = new FileStream(filename, FileMode.Open))
        {
            int length = (fs.Length < contentLength ? (int)fs.Length : contentLength);
            byte[] b = new byte[length];
            fs.Read(b, 0, contentLength);
            string str = System.Text.ASCIIEncoding.UTF8.GetString(b);
            if (str.LastIndexOf("\r") > 0)
                retString = str.Substring(0, str.LastIndexOf("\r"));
            else
                retString = str;
        }
        return retString;
    }

然后像这样调用它来写入新文件:

string filename = "c:\\test.txt";
File.WriteAllText(filename,GetString(filename, 100));