Last 10 Files oder so

zioProduct

Erfahrenes Mitglied
Huhu,
Also folgendes Problem. Ich habe einen FileDialog in dem ich eine Datei, zB .bmp auslesen kann, welche anschliessend geladen wird. Neben dem Button für den FileDialog hab ich noch neChoiceList, wo ich die Letzten 10 geladenen Files anzeigen lassen will. Das Problem ist nur ich hab nicht wirklick ne Ahnung wie ich das machen soll.

Meine überlegungen:

Code:
FileStream amfStream = new FileStream(aktMFile, FileMode.OpenOrCreate, FileAccess.Read);
			BinaryReader amfReader = new BinaryReader(amfStream);
			for(i = 0;i<10;i++)
			{
				if(amfStream.Length>0)
					lastTen[i] = amfReader.ReadString();

			}

So wîll ich auslesen ob schon 10 FilesVorhanden sind, denn wenn es 10 sind und ich ein neues File über den Button aussuche, soll er mir da das älteste Löschen, alle eines Nach unten Setzten und mir das Aktuellste oben hinschreiben...

Ich bin echt überfragt. Wer ne gute Idee, oder ein wenig Code, oder Link oder was weis ich hat, sagt es bitte :(

So ne "simple" Aufgabe und ich heng fest -.-* Also, so simpel ist es gar nicht, nach meinen Überlegungen, aber ich wette es gibt ne einfachere Lösung dafür oO?

mfg

zio
 

Christian Kusmanow

Erfahrenes Mitglied
Hallo zioProduct!

So wîll ich auslesen ob schon 10 FilesVorhanden sind, denn wenn es 10 sind und ich ein neues File über den Button aussuche, soll er mir da das älteste Löschen, alle eines Nach unten Setzten und mir das Aktuellste oben hinschreiben...
Schieb die DateiNamen einfach in ein Stack. Sofern ich jetzt dein Problem verstanden hab.

MfG, cosmo
 

zioProduct

Erfahrenes Mitglied
Cool, Stack kannte ich gar nicht, das wird in meinem Buch nicht mal erwähnt -.-*
Auf jedenfall klappt es fast Prima ;)

Ich hab noch ein Problem, durch das Stack zeigt er mir in meiner ChoiceInputList soviele "pfade" wie ich halt habe, das Problem ist nur, ich weiss nicht recht wie, ich das auf meine 10 "pfade" beschränken kann. Also doch ich weiss wie ich es beschränke, aber ich weiss nicht wie ich denn ersten Eintrag im Stack lösche, und dann einen neuen Hinzufügen kann. Momentan mache ich es so:

Code:
if(stacki.Count!=0)
			{
				if(stacki.Count==10)
					stacki.Pop();

				System.Collections.IEnumerator en = stacki.GetEnumerator();
				tcChoiceListInput1.Items.Clear();
				while (en.MoveNext()) 
				{
					tcChoiceListInput1.Items.Add(en.Current);
				}

			}

Das Problem ist nur, er löscht mir:
1. den Obersten Datensatz (Ich weiss liegt am pop, aber wie kann ich dem pop sagen das er den untersten Eintrag (Count==1) nehmen soll? stacki.pop(stacki.count==1) geht nicht soviel ich weiss!
2. Ich komme so gar nicht mehr auf 10, sondern nur noch 9 "pfade" die angezeigt werden. D.h er schreibt mir den 10. gar nimmer, oder sowas ähnliches.

Bitte nochmal um ne kleine Denkhilfe :)

mfg
ziop
 

Christian Kusmanow

Erfahrenes Mitglied
Hi!

Ich glaub ich hatte das doch nicht ganz verstanden. :-(
Also mit dem Stack klappt das so nicht.
Ich hab es jetzt selber mal ausprobiert und hab es jetzt mal mit einem Queue versucht.
Auch nicht genau das was Du brauchst, geht aber erstmal.
Code:
using System.Collections;

namespace QueueEx
{
	/// <summary>
	/// Erweitert die Funktionalität des Queue und schränkt ihn auf 10 Einträge ein.
	/// </summary>
	public class QueueEx : Queue
	{
		public QueueEx() : base(10) {}

		public void Enqueue( string Path ) {
			if ( base.Count > 9 )
				base.Dequeue();

			base.Enqueue( Path );
		}

		public new string Dequeue() {
			return (string) base.Dequeue();
		}
	}
}
Einen besseren Vorschlag als das Du Dir selber so eine Collection baust,
kann ich nicht machen. Sollte aber für Dich nicht so schwer sein. :)
Hab da jetzt leider keine Idee weiter. :(

MfG, cosmo
 

zioProduct

Erfahrenes Mitglied
Einen besseren Vorschlag als das Du Dir selber so eine Collection baust,
kann ich nicht machen. Sollte aber für Dich nicht so schwer sein.
Haha, ich lach mich schlapp :suspekt:

Ne, wiso soll denn das mit dem Stack nicht gehen? Ist es nicht möglich das unterste File des Stacks zu löschen? Das doch das einzige was mir noch fehlt :eek:

Naja google ich halt mal nach dem queue oder so ;)

Trotzdem schonmal Danke ;)
 

zioProduct

Erfahrenes Mitglied
*Hust* :) Naja ich bin gerade mit dem queue dranne, bei demm geht alles TipTop, auser..... Das er mir die Files in der falschen Reihenfolge in der ChoiceListbox auflistet, also das älteste zu oberst. Gibt es da direkt vom queue eine möglich das zu ändern oder muss ich das über ein eingeschobenes Array Lösen, oder hat soonst einer ne Idee? Und wehe du kommst wieder mit der Collection Chaos :)

Vergiss nicht ich bin grober Anfänger, also behandle mich auch so :)

ps:

Code:
Queue que10 = new Queue();

if(i<10)
			{
				if(filedialog.DialogResult == DialogResult.OK)
				{
					string pfad = filedialog.FileName;
					tcLblMarkFile.Text = filedialog.FileName;
					FileStream wStream = new FileStream(aktMFile, FileMode.OpenOrCreate,FileAccess.Write);
					BinaryWriter binWrite = new BinaryWriter(wStream);
					binWrite.Write(pfad);
					que10.Enqueue(pfad);
					i++;

					binWrite.Flush();
					binWrite.Close();
					wStream.Close();

				
				}

}
		
			if(que10.Count!=0)
			{
				if(que10.Count==11)
					que10.Dequeue();

				System.Collections.IEnumerator en = que10.GetEnumerator();
				tcChoiceListInput1.Items.Clear();
				while (en.MoveNext()) 
				{
					tcChoiceListInput1.Items.Add(en.Current);
				}

			}

So mach ich das jetzt und es klappt wie gesagt wunderbar, bis auf die Reihenfolge, also, need Tipps :) Sonst mach ich das halt mit dem Array, aber erst noch n bissl warten obs ne schneller Möglichkeit gibt :)
 

Christian Kusmanow

Erfahrenes Mitglied
Kopier doch die Einträge vorläufig in ein Array was Du dann von hinten nach vorne ausgibst.
Code:
Array ary = que10.ToArray();
for ( byte b = ary.Length; b > 0; b-- )
	tcChoiceListInput1.Items.Add( ary.GetValue( b ) );
Ließ dich bitte irgendwann mal in Collections ein.
Das ist eine mächtige Datenverwaltung,
die Du komplett nach deinen Bedürfnissen anpassen kannst.

Auch kannst Dir so eine Collection wie Du sie brauchst auch selber stricken.
Das ist wirklich nicht schwer. Und machs OOP gerecht, dann hast was für die Zukunft. ;)

MfG, cosmo
 

zioProduct

Erfahrenes Mitglied
HA! Erwischt :) Ich glaube du liest gar nicht was ich schreibe ;)
Sonst mach ich das halt mit dem Array, aber erst noch n bissl warten obs ne schneller Möglichkeit gibt .

Kopier doch die Einträge vorläufig in ein Array was Du dann von hinten nach vorne ausgibst.

Und wehe du kommst wieder mit der Collection Chaos

Ließ dich bitte irgendwann mal in Collections ein.

:) :) :) :)

Ne, ich schau mir die Collections mal an ;) Damit das nicht nochmal vorkommt :) und nagut dann mach ichs halt mitm Array ;)

mfg
ziop