0

我有一个包含员工数据和图像记录的文件。一名员工的每条记录及其数据、他的图像和他的妻子图像。我无法更改文件结构

文本数据和图像之间有分隔符。

这里是一个记录的样本

记录号D01=员工姓名!=IMG1=员工形象~\IMG2=妻子形象^! \r\n

D01= & !=IMG1= & ~\IMG2= & ^!是分隔符

这是如何编写文件的代码:

FileStream fs = new FileStream(filePath, FileMode.Create);
StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
BinaryWriter bw = new BinaryWriter(fs);

sw.Write(employeeDataString);
sw.Write("!=IMG1=");
sw.Flush();

bw.Write(employeeImg, 0, employeeImg.Length);
bw.Flush();

sw.Write(@"~\IMG2=");
sw.Flush();

bw.Write(wifeImg, 0, wifeImg.Length);
bw.Flush();

sw.Write("^!");
sw.Flush();

sw.Write(@"\r\n");
sw.Flush();

那么如何读取该文件呢?

4

1 回答 1

0

文件种类繁多;三种最常见的存储记录方式是

  • 固定大小的记录,理想情况下具有固定大小的字段。实现随机访问非常简单。
  • 带有标签和数据交织的标记文件。有点复杂,但高度灵活,并且仍然相当有效地可读,因为标签保存数据的位置和长度。
  • 然后是分隔文件。总是很痛苦。

两个问题:

  • 您必须确保分隔符永远不会出现在数据中。当你有像图像这样的二进制数据时,不是 100% 可能的。
  • 没有有效的方法来访问个人记录..

忽略第一个问题,这是一段将所有记录读入 class 列表的代码ARecord

FileStream fs;
BinaryReader br;
List<ARecord> theRecords;

class ARecord
{
    public string name { get; set; }
    public Image img1 { get; set; }
    public Image img2 { get; set; }
}

int readFile(string filePath)
{
    fs = new FileStream(filePath, FileMode.Open);
    br = new BinaryReader(fs, Encoding.UTF8);

    theRecords = new List<ARecord>();
    ARecord record = getNextRecord();
    while (record != null)
    {
        theRecords.Add(record);
        record = getNextRecord();
    }
    return theRecords.Count;
}

ARecord getNextRecord()
{
    ARecord record = new ARecord ();

    MemoryStream ms;
    System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
    byte[] sepImg1 = enc.GetBytes(@"!=IMG1=");
    byte[] sepImg2 = enc.GetBytes(@"~\IMG2=");
    byte[] sepRec = enc.GetBytes(@"^!\r\n");

    record.name = enc.GetString(readToSep(sepImg1));

    ms = new MemoryStream(readToSep(sepImg2));
    if (ms.Length <= 0) return null;             // check for EOF
    record.img1 = Image.FromStream(ms);

    ms = new MemoryStream(readToSep(sepRec));
    record.img2 = Image.FromStream(ms);

    return record;
}

byte[] readToSep(byte[] sep)
{
    List<byte> data = new List<byte>();
    bool eor = false;
    int sLen = sep.Length;
    int sPos = 0;
    while (br.BaseStream.Position < br.BaseStream.Length && !eor )
    {
        byte b = br.ReadByte();
        data.Add(b);
        if (b != sep[sPos]) { sPos = 0; }
        else if (sPos < sLen - 1) sPos++; else eor = true;
    }
    if (data.Count > sLen ) data.RemoveRange(data.Count - sLen , sLen );
    return data.ToArray();
}

笔记:

  • 没有任何错误检查。
  • 注意那些分隔符!真的是对的@吗??
  • 扩展代码创建记录号留给您
于 2014-09-24T06:43:01.237 回答