📄 fileworks.cs
字号:
removelist.Add(thisOffset);
//insertBuffer.Remove(removelist);
//下面应该写错了, .Contains()是判断同个对象,而不是相等对象
//if (insertBuffer.Contains(removelist))//如果只是在buffer,还未写入硬盘
//{
// insertBuffer.Remove(removelist);
//}
i = 0;
int j = 0;
int flag = 0;
//因为不知道怎么重写ArrayList.Equals();不得已的办法
foreach (ArrayList testlist in insertBuffer)
{
i = 0;
foreach (Object elem in testlist)
{
if (!elem.Equals(removelist[i]))//不相等就跳出
{
//flag = 1;
break;
}
i++;
}
if (i == testlist.Count)//相等就跳出
{
flag = 1;
break;
}
j++;
}
if (flag == 1)
{
insertBuffer.RemoveAt(j);
}
removeBuffer.Add(removelist);
EmptyRecs.Add(thisOffset);
return true;
}
//complete
//file_Of_trees has Strings as its element
public bool saveToFile(ArrayList trees, ArrayList file_Of_trees)
{
//晕,居然忘记考虑只有remove的情况了,于是写了下面的废代码
//if (insertBuffer.Count == 0)
//{
// return false;
//}
FileInfo ofd;
StreamWriter Swriter;
//Stream ofileforMain;
FileStream writer;
#region//trees region complete
int i = 0;
foreach (Object tree in trees)
{
ofd = new FileInfo((String)file_Of_trees[i]);
//StreamWriter otreefile = new StreamWriter(@"F:\testDS\test.bin");
Swriter = ofd.CreateText();
if(tree is Treeworks.BPTree<int, int, intintCompare>)
{
saveTreeToFile((Treeworks.BPTree<int, int, intintCompare>)tree, Swriter);
}
else if (tree is Treeworks.BPTree<string, int, strstrCompare>)
{
saveTreeToFile((Treeworks.BPTree<string, int, strstrCompare>)tree, Swriter);
}
i++;
}
#endregion
#region//EmptyRecs region complete
ofd = new FileInfo(nameofEmptyRecs);//急需修改,如何改成读写本文件夹下的文件路径?
if (ofd.Exists && ((ofd.Attributes & FileAttributes.ReadOnly) == 0))
{
Swriter = ofd.CreateText();
foreach (int emptyrec in EmptyRecs)
{
Swriter.Write("{0} ", emptyrec.ToString().PadRight(20, ' '));//count the length of int 20
}
Swriter.Close();
}
#endregion
#region//MainRecs region
ofd = new FileInfo(nameofMainRecs);//急需修改,如何改成读写本文件夹下的文件路径?
if (ofd.Exists && ((ofd.Attributes & FileAttributes.ReadOnly) == 0))
{
StringBuilder str = new StringBuilder();
//ofileforMain = ofd.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
writer = ofd.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
//writer = File.Open(
foreach (ArrayList insertlist in insertBuffer)
{
//将insertlist中最后的那个offset赋值给别人后删除这个元素
int thisOffset = (int)insertlist[insertlist.Count - 1];
insertlist.RemoveAt(insertlist.Count - 1);
i = 0;
str.Remove(0, str.Length);
foreach (Object rec in insertlist)
{
str.Append(rec.ToString().PadRight((int)(sizeofRec[i]), ' ') + " ");
i++;
}
byte[] thisline = Encoding.Default.GetBytes(str.ToString());
//ofileforMain.Seek((long)thisOffset * sizeofRec * numofColumn, SeekOrigin.Begin);
writer.Seek((long)thisOffset * sizeofLine, SeekOrigin.Begin);
writer.Write(thisline, 0, thisline.Length);
}
//ofileforMain.Close();
writer.Close();
}
#endregion
#region//test Index.bin region
ofd = new FileInfo(nameofIndex);
//暂时就是这些,如果用户管理肯定要增加
Swriter = ofd.CreateText();
Swriter.WriteLine(nameofMainRecs);
Swriter.WriteLine(nameofEmptyRecs);
Swriter.WriteLine(MaxOffset);
StringBuilder strBlder = new StringBuilder();
foreach (object obj in sizeofRec)
{
strBlder.Append(obj.ToString() + ' ');
}
Swriter.WriteLine(strBlder);
int count = 0;
foreach (object obj in file_Of_trees)
{
if (this.Trees[count] is Treeworks.BPTree<int, int, intintCompare>)
{
Swriter.WriteLine("int int " + obj.ToString());
}
else if (this.Trees[count] is Treeworks.BPTree<string, int, strstrCompare>)
{
Swriter.WriteLine("string int " + obj.ToString());
}
else
{ //nothing to do
}
count++;
}
//Swriter.WriteLine();
Swriter.Close();
#endregion
//好险忘了这个
insertBuffer.Clear();
removeBuffer.Clear();
return true;
}
//complete
//have to close otreefile
private bool saveTreeToFile(Treeworks.BPTree<int, int, intintCompare> tree, StreamWriter otreefile)
{
ArrayList treeBuffer = new ArrayList();
Treeworks.BPNode<int> temptr = tree.leftMostleaf;
while (temptr != null)
{
for (int i = 0; i < temptr.numrec; i++)
{
Object templptr = temptr.recs[i].ptr;
ArrayList line = new ArrayList();
line.Add(temptr.recs[i].key);
if (templptr is Treeworks.Link<int>)//有下挂链表
{
while (templptr != null)
{
line.Add(((Treeworks.Link<int>)templptr).ptr);
templptr = ((Treeworks.Link<int>)templptr).lptr;//下移
}
}
else//无下挂链表
{
line.Add(templptr);
}
treeBuffer.Add(line);
}
temptr = temptr.rightptr;
}
foreach (ArrayList a in treeBuffer)
{
foreach (Object p in a)
{
otreefile.Write("{0} ", p);
}
otreefile.WriteLine();
//otreefile.WriteLine("{0}", a.ToArray());//这个只能打印出数组第一个元素,真不知道WriteLine的这个重载有什么用
}
otreefile.Close();
return true;
}
//c#2.0对泛型的支持似乎仍然只是停留在表面,
//不支持模板类作为函数参数传递使得它的应用受到很大限制
//比如说居然要这个函数重载同一模板类的不同类型......失败啊
private bool saveTreeToFile(Treeworks.BPTree<string, int, strstrCompare> tree, StreamWriter otreefile)
{
ArrayList treeBuffer = new ArrayList();
Treeworks.BPNode<string> temptr = tree.leftMostleaf;
while (temptr != null)
{
for (int i = 0; i < temptr.numrec; i++)
{
Object templptr = temptr.recs[i].ptr;
ArrayList line = new ArrayList();
line.Add(temptr.recs[i].key);
if (templptr is Treeworks.Link<string>)//有下挂链表
{
while (templptr != null)
{
line.Add(((Treeworks.Link<string>)templptr).ptr);
templptr = ((Treeworks.Link<string>)templptr).lptr;//下移
}
}
else//无下挂链表
{
line.Add(templptr);
}
treeBuffer.Add(line);
}
temptr = temptr.rightptr;
}
foreach (ArrayList a in treeBuffer)
{
foreach (Object p in a)
{
otreefile.Write("{0} ", p);
}
otreefile.WriteLine();
//otreefile.WriteLine("{0}", a.ToArray());//这个只能打印出数组第一个元素,真不知道WriteLine的这个重载有什么用
}
otreefile.Close();
return true;
}
//complete /////but maybe some bugs in
public bool giveUpChanges(ArrayList trees)
{
//写了大段很废的代码,最后决定还是读文件!
//ArrayList tempBuffer = new ArrayList(insertBuffer.Count);
//tempBuffer = ArrayList.Synchronized(insertBuffer);//copy insertBuffer to tempBuffer
//foreach (ArrayList templist in insertBuffer)
//{
// tempBuffer.Add(templist);
//}
//insertBuffer.Clear();
//foreach(ArrayList removedRec in removeBuffer)
//{
// removedRec.RemoveAt(removedRec.Count - 1);
// insert(removedRec, trees);
//}
//removeBuffer.Clear();
//foreach (ArrayList insertedRec in tempBuffer)
//{
// Object thisOffset = insertedRec[insertedRec.Count - 1];
// insertedRec.RemoveAt(insertedRec.Count - 1);
// remove(insertedRec, ref thisOffset, trees);
//}
readAllFromFile();
insertBuffer.Clear();
removeBuffer.Clear();
return true;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -