2014-05-21 3 views
0

У меня есть следующий код для удаления некоторых частей файла. Параметры метода: filePath и список местоположений вместе с длиной для удаления из каждого местоположения.Как удалить строки из файла в C#

Не могли бы вы проверить, что я делаю это правильно? Спасибо

ПРИМЕЧАНИЕ. Детали, подлежащие удалению, не будут перекрываться. Я еще не добавил проверку.

static void DeleteFileParts(string filePath, List<Tuple<int, int>> T) 
    { 
     using (var fileStream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite)) 
     { 
      int tLen = 0; 
      int lastWriteL = 0; 
      int len = (int)fileStream.Length; 
      byte[] b1 = new byte[len]; 
      for (int i = 0; i < T.Count; i++) 
      { 
       Tuple<int, int> t = T[i]; 
       tLen += t.Item2; 

       fileStream.Seek(t.Item1 + t.Item2, 0); 

       int b1Len = i == T.Count - 1 ? (len - t.Item1 - t.Item2) : (T[i + 1].Item1 - t.Item1 - t.Item2); 
       fileStream.Read(b1, 0, b1Len); 

       fileStream.Seek(lastWriteL == 0 ? t.Item1 : lastWriteL, 0); 
       fileStream.Write(b1, 0, b1Len); 

       lastWriteL += t.Item1 + b1Len; 
      } 

      fileStream.SetLength(len - tLen); 
     } 
    } 
+0

Если это рабочий код, он, вероятно, будет более подходящим для SE – BradleyDotNET

ответ

1

Вы используете Read метод неправильно (но вы не одиноки, что довольно часто).

Метод Read не гарантирует, что он будет считывать столько байтов, сколько вы запрашиваете. Он может читать только часть этого, и он вернет количество байтов, которое оно фактически помещает в буфер. Вы должны использовать это возвращаемое значение, и продолжайте чтение, пока вы не все байты, что вам нужно:

int len = 0; 
while (len < b1Len) { 
    len += fileStream.Read(b1, len, b1Len - len); 
} 
+0

Просмотр Кода ок Guffa..thanks –

Смежные вопросы