You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/BuildReport/Scripts/Editor/Utility/DldUtil_BigFileReader.cs

282 lines
5.4 KiB
C#

2 months ago
using System;
using System.Collections.Generic;
using System.IO;
namespace DldUtil
{
public static class BigFileReader
{
public static bool FileHasText(string path, params string[] seekText)
{
if (!File.Exists(path))
{
return false;
}
FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BufferedStream bs = new BufferedStream(fs);
StreamReader sr = new StreamReader(bs);
while (true)
{
var line = sr.ReadLine();
if (line == null)
{
break;
}
for (var seekTextIdx = 0; seekTextIdx < seekText.Length; ++seekTextIdx)
{
if (line.IndexOf(seekText[seekTextIdx], StringComparison.Ordinal) >= 0)
{
sr.Close();
bs.Close();
fs.Close();
return true;
}
}
}
sr.Close();
bs.Close();
fs.Close();
return false;
}
public static string SeekText(string path, params string[] seekText)
{
FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BufferedStream bs = new BufferedStream(fs);
StreamReader sr = new StreamReader(bs);
//long currentLine = 0;
while (true)
{
//++currentLine;
var line = sr.ReadLine();
//Debug.LogFormat("seeking... line number {0}: {1}", currentLine, line);
// reached end of file?
if (line == null)
{
break;
}
for (var seekTextIdx = 0; seekTextIdx < seekText.Length; ++seekTextIdx)
{
if (line.IndexOf(seekText[seekTextIdx], StringComparison.Ordinal) >= 0)
{
return line;
}
}
}
return string.Empty;
}
public struct FoundText
{
public long LineNumber;
public string Text;
}
public static List<FoundText> SeekAllText(string path, params string[] seekText)
{
FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BufferedStream bs = new BufferedStream(fs);
StreamReader sr = new StreamReader(bs);
List<FoundText> returnValue = new List<FoundText>();
long currentLine = 0;
while (true)
{
++currentLine;
var line = sr.ReadLine();
//Debug.LogFormat("seeking... line number {0}: {1}", currentLine, line);
// reached end of file?
if (line == null)
{
break;
}
for (var seekTextIdx = 0; seekTextIdx < seekText.Length; ++seekTextIdx)
{
if (line.IndexOf(seekText[seekTextIdx], StringComparison.Ordinal) >= 0)
{
FoundText newFoundText;
newFoundText.LineNumber = currentLine;
newFoundText.Text = line;
returnValue.Add(newFoundText);
}
}
}
return returnValue;
}
public static IEnumerable<string> ReadFile(string path, params string[] seekText)
{
return ReadFile(path, true, seekText);
}
public static IEnumerable<string> ReadFile(string path, bool startAfterSeekedText, params string[] seekText)
{
var fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
var bs = new BufferedStream(fs);
var sr = new StreamReader(bs);
string line;
bool seekTextRequested = (seekText != null) && (seekText.Length > 0) && !string.IsNullOrEmpty(seekText[0]);
long seekTextFoundAtLine = -1;
if (seekTextRequested)
{
long currentLine = 0;
while (true)
{
++currentLine;
line = sr.ReadLine();
//Debug.LogFormat("seeking... line number {0}: {1}", currentLine, line);
// reached end of file?
if (line == null)
{
break;
}
var atLeastOneSeekTextFound = false;
for (var seekTextIdx = 0; seekTextIdx < seekText.Length; ++seekTextIdx)
{
if (line.IndexOf(seekText[seekTextIdx], StringComparison.Ordinal) >= 0)
{
atLeastOneSeekTextFound = true;
break;
}
}
// if seekText not found yet, continue search
if (!atLeastOneSeekTextFound)
{
continue;
}
seekTextFoundAtLine = currentLine;
//Debug.Log("seeking: " + line);
//Debug.LogFormat("seekText found at line number {0}: {1}", currentLine, line);
}
//Debug.Log("done seeking");
if (seekTextFoundAtLine != -1)
{
fs.Seek(0, SeekOrigin.Begin);
currentLine = 0;
while (true)
{
++currentLine;
line = sr.ReadLine();
if (line == null)
{
break;
}
if (startAfterSeekedText && currentLine <= seekTextFoundAtLine)
{
continue;
}
if (!startAfterSeekedText && currentLine < seekTextFoundAtLine)
{
continue;
}
//Debug.Log("seeked: " + line);
yield return line;
}
}
}
else
{
while (true)
{
line = sr.ReadLine();
if (line == null)
{
break;
}
yield return line;
}
}
sr.Close();
bs.Close();
fs.Close();
}
public static IEnumerable<string> ReadFile(string path)
{
var fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
var bs = new BufferedStream(fs);
var sr = new StreamReader(bs);
while (true)
{
var line = sr.ReadLine();
if (line == null)
{
break;
}
yield return line;
}
sr.Close();
bs.Close();
fs.Close();
}
public static IEnumerable<FoundText> ReadFileWithLine(string path)
{
var fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
var bs = new BufferedStream(fs);
var sr = new StreamReader(bs);
long currentLineNumber = 0;
while (true)
{
++currentLineNumber;
var line = sr.ReadLine();
if (line == null)
{
break;
}
FoundText text;
text.Text = line;
text.LineNumber = currentLineNumber;
yield return text;
}
sr.Close();
bs.Close();
fs.Close();
}
}
}