Custom Stream wilt niet lezen van buffer

Status
Niet open voor verdere reacties.

MatthiWare

Gebruiker
Lid geworden
2 jul 2011
Berichten
282
Hallo allemaal!

Ik heb een stream gemaakt die een een zelfgemaakte class behandeld, (eerste keer dat ik zelf een stream implementatie maak)
in de zelfgemaakt class heb ik een buffer zitten waar naartoe geschreven en gelezen moet worden als je de StreamWriter en StreamReader gebruikt.

Nu de StreamWriter werkt maar als ik wil lezen krijg ik altijd niets terug.

Test code zodat je weet wat ik met het bovenstaande bedoel:
Code:
POFile file = POFile.Create(@"ROOT:\\Libraries\Pictures\test.png");
StreamWriter sw = new StreamWriter(file.GetStream(), Encoding.Default);
sw.WriteLine("Dit is een test");
sw.Close();

Console.WriteLine(file.ReadAllText()); //Dit geeft 'Dit is een test' terug
//Maar als ik dit gebruik:

StreamReader sr = new StreamReader(file.GetStream(), Encoding.Default);
Console.WriteLine(sr.ReadToEnd()); //Dit is leeg
sr.Close();

POFile.cs:
Code:
public class POFile
{
    private String _name;
    public String Name
    {
        get { //... }
        set { //... }
    }

    private String _fullFileName;
    public String FullFileName 
    {
        get { //... }
        set { //... }
    }

    private Byte[] _raw = new Byte[0];
    private Byte[] Raw
    {
        get { return _raw; }
        set { _raw = value; }
    }

    public Stream GetStream()
    {
        POStream mem = new POStream(this);
        return mem;
    }

    public Byte[] ReadAllBytes() { //... }

    public String ReadAllText() { //... }

    public void Write(String text) { //... }

    public void Write(Byte[] raw) { //... }

    public void AppendWrite(String text) { //... }

    public void AppendWrite(Byte[] raw) { //... }

    private static String GetPathWithoutFile(String[] s) { //... }

    private static POFile Searcher(PODirectory currDir, String fullPath, String name, Boolean create) { //... }

    public static POFile Open(String path) { //... } 

    public static POFile Create(String path) { //... }
}

POStream.cs:
Code:
public class POStream : MemoryStream
{
    private POFile file;

    public POStream(POFile file)
        : base()
    {
        if (file == null)
            throw new ArgumentNullException("file", "The file cannot be null.");

        this.file = file;
    }

    public POStream(String path)
        : base()
    {
        if (path == null)
            throw new ArgumentNullException("path", "The path cannot be null.");

        if (path == "")
            throw new ArgumentException("The path cannot be empty", "path");

        this.file = POFile.Create(path);
    }

    public override void Flush()
    {
        file.Write(this.GetBuffer());
        base.Flush();
    }
}

Bedankt
 
Laatst bewerkt:
@Bloodshed,

Ik kan schrijven maar het is lezen dat niet gaat.
En als ik de Close methode gebruikt van de streamwriter flushd hij ook.
 
Ik had even een voorbeeld gemaakt voor mijzelf, maar ik sloot de stream achteraf.

Als je niet perse een stream writer of reader hoeft te gebruiken:

Code:
string data = Encoding.Default.GetString(file.GetStream().GetBuffer());
of als deze data in je Raw property zit
Code:
string data = Encoding.Default.GetString(file.Raw);

Anders kun je misschien een voorbeeld console projectje maken, ik heb zelf een test gemaakt waar werkt het wel werkte. Maar waarschijnlijk niet zoals jij gebruikt.


Anders: debuggen helpt je ook niet verder? Kijken of de 2e GetStream() wel goed werkt omdat je een nieuwe stream maakt bij elke GetStream() etc
 
Ik weet dat ik niet perse een streamwriter/streamreader hoef te gebruiken, je kan de schrijf en lees functies van de POFile zelf gebruiken (deze werken wel).
Maar dit is een plugin applicatie met een zelfgemaakte extensie van .Net die bepaalde onderdele van .Net heeft aangepast voor beter werking als je een plugin wilt maken.
Dus heb ik liever dat je nog zo veel mogelijk de standaard codes kunt gebruiken (streamwriter/reader).

Oke ik heb eventjes getest met een private stream te maken in de POFile en dan via de GetStream() methode te kijken of hij null was en dan een nieuwe instantie maken, en de stream terugkeren.
Maar als ik dan teste kreeg ik een ArgumentException: de stream is niet leesbaar en als ik de code die hierbove sta gebruik krijg ik deze exception niet maar krijg ik een lege string terug.

Als ik debug zie ik dat de waardes van raw in de POFile nog altijd bestaan maar als ik kijk naar de StreamReader staat de eigenschap 'EndOfStream' als direct op true.
En de charBuffer en byteBuffer in de streamreader zijn bijde leeg voor en na het proberen lezen.

Ik post direct een voorbeeld met source code :D (nog ffjes aan het maken)
 
Laatst bewerkt:
Kun je eens proberen je writer ipv Close alleen te Flushen? Even de Close commenten.

(Als je teamviewer hebt zou handig zijn voor meekijken ofzo)
 
Ik heb eens getest met alleen te flushen maar dat werkt ook niet (lege string)

En ja ik heb TeamViewer (ff beveiligings update download)

Ga bij meetings en vul deze ID in : m91-420-005
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan