FileStream otwieranie

0

Witam, piszę aplikację, której częścią jest zapis i odczyt plików - załączników.
z zapisem do bazy danych jako byte array nie miałem problemów, teraz pojawia się problem ponieważ chciał bym taki plik otworzyć bez konieczności zapisywania go na dysku - nie wiem czy jest to możliwe jeśli tak to w jaki sposób - proszę o pomoc.
odczyt i zapis do pliku wykonuję w nast. sposób:

using (FileStream fsNew = new FileStream(pathNew,
                    FileMode.Create, FileAccess.Write))
                {
                    fsNew.Write(bytes, 0, numBytesToRead);
                }

proszę o pomoc.

0

Nie rozumiem pytania :P
Opisz co konkretnie chcesz osiągnąć.
Co dla Ciebie oznacza słowo "plik"?

0

posiadam zapisany w bazie danych plik w postaci byte- chcę go otworzyć- i pytam czy można to zrobić bez konieczności zapisywania go na dysku.
jeśli jest taka możliwość to jak wygląda edycja - aby była możliwość edycji t?

0

pokaz w jaki sposób pobierasz plik z bazy aktualnie
co to za baza?

0

baza jest stworzona prze ze mnie, obecnie pobieram go w ten sposób:

public static byte[] GetFileAppendage(int subtyp, int typ, int kartoteka, string sFileName)
        {
            using (EntitiesPOK db = new EntitiesPOK())
            {
                var wynik = from c in db.FileAppendage
                            where c.typ == typ && c.subtyp == subtyp && c.kartoteka == kartoteka && c.nazwaPliku == sFileName
                            select c;
                foreach (var item in wynik)
                {
                    if (item.subtyp == subtyp && item.typ == typ && item.kartoteka == kartoteka && item.nazwaPliku == sFileName)
                        return item.plikByte;
                }
            }

            return null;
        }

metoda do konwersji z byte na plik i zapis.

public void RedByteFileAndSave(byte[]byteFile,string path)
        {
            try
            {
                byte[] bytes = byteFile;
                int numBytesToRead = bytes.Length;
                using (FileStream fsNew = new FileStream(path,
                    FileMode.Create, FileAccess.Write))
                {
                    fsNew.Write(bytes, 0, numBytesToRead);
                }
            }
            catch (FileNotFoundException ioEx)
            {
                MessageBox.Show(ioEx.Message);
            }
        }

wywołanie:

 SaveFileDialog saveFileDlg = new SaveFileDialog();
            saveFileDlg.FileName = "fileName.txt";
            saveFileDlg.InitialDirectory = Directory.GetCurrentDirectory();
            if (saveFileDlg.ShowDialog() == DialogResult.OK)
            {
                if (saveFileDlg.FileName != "")
                {
                    string pathNew = @"D:\newfile.txt";
                    AttendanceOfEnclosure fread = new AttendanceOfEnclosure();
                    fread.RedByteFileAndSave(DatabaseRepositoryFileAppendage.GetFileAppendage(2, 0, 0,saveFileDlg.FileName), pathNew);
                }

            }

to działa jak najbardziej poprawnie jednak pytam czy jest możliwość otworzenia pliku bez konieczności jego zapisania na dysku.
Aby otworzyć ten plik to wystarczy wykonać:

System.Diagnostics.Process.Start(@"D:\newfile.txt");

jednak chciał bym uniknąć zapisywania i kasowania plików, nie do końca też mam pomysł jak się zachować podczas edycji - z aplikacji będzie korzystał więcej niż jeden użytkownik.

0

Napisałeś swój własny silnik bazy danych? <sarkazmmode> nieźle </sarkazmmode>
Dalej nie rozumiem co chcesz zrobić. Czy chodzi ci o pobranie pliku z bazy i tylko tyle? Jeśli tak, to nie widze problemu, bo już to robisz w kodzie #1.
"System.Diagnostics.Process.Start(@"D:\newfile.txt");" - kto cię uczył tak otwierać pliki :/?

@Edit
https://msdn.microsoft.com/en-us/library/system.io.file%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
?

0
Makciek napisał(a):

Napisałeś swój własny silnik bazy danych? <sarkazmmode> nieźle </sarkazmmode>
Dalej nie rozumiem co chcesz zrobić. Czy chodzi ci o pobranie pliku z bazy i tylko tyle? Jeśli tak, to nie widze problemu, bo już to robisz w kodzie #1.
"System.Diagnostics.Process.Start(@"D:\newfile.txt");" - kto cię uczył tak otwierać pliki :/?

bazę danych sam projektuję zgodnie z tym co potrzebuję, chodzi mi o to żeby otworzyć plik zapisany jako Byte w bazie danych bez wcześniejszego zapisu na dysku.
to akurat podałem głupi przykład otwarcia pliku ;)

0

do otwierania plików jak masz txt użyj

StreamReader

Tutaj masz tą, klase z przykładem.
https://msdn.microsoft.com/pl-pl/library/system.io.streamreader(v=vs.110).aspx

0

Powinno być tak:

public static byte[] GetFileAppendage(int subtyp, int typ, int kartoteka, string sFileName)
        {
            using (EntitiesPOK db = new EntitiesPOK())
            {
                var plik = db.FileAppendage.FirstOrDefault(item => item.subtyp == subtyp && item.typ == typ && item.kartoteka == kartoteka && item.nazwaPliku == sFileName);
        if(plik!=null)
               return plik.plikByte;
         return null;
            }
        }

Ta metoda zwraca byte[], czyli twój plik, nie ma żadnej potrzeby zapisywania go gdziekolwiek przed odczytem, dlatego wciąż nie rozumiem pytania.
Poczytaj o linq, składni fluent, operacji na plikach.
I najważniejsze o formułowaniu pytań w sposób zrozumiały, tzn taki, który zawiera opis sytuacji zastanej, oczekiwanej i na czym polega problem, który przeszkadza w zmiany tej pierwszej w drugą.
Miłego wieczora

0

dobrze, ale nadal mi nie pomogłeś - napisałeś jak poprawnie napisać metodę do pobierania byte[] z bazy danych, a ja potrzebuję po pobraniu byte[] pliku otworzyć go- uruchomić- wyświetlić użytkownikowi na monitorze bez zapisywania na dysku - i o to od początku pytam...

0

Przecież to zależy od tego jaki to rodzaj pliku i jaki rodzaj aplikacji piszesz. Jak chcesz wyświetlić ten plik, używając domyślnej systemowej aplikacji skojarzonej z tym typem plików?

0

tak dokładnie za pomocą domyślnej aplikacji w windows.
pliki to głównie txt, doc itp.

2

No ok, to jak chcesz otworzyć jakimkolwiek programem plik i jednocześnie nie mieć pliku?

Masz dwa wyjścia - albo zapisz plik do katalogu tymczasowego (są do tego wygodne metody) albo napisz swój program, który będzie wyświetlał pobrane dane bezpośrednio z pamięci.

0
somekind napisał(a):

No ok, to jak chcesz otworzyć jakimkolwiek programem plik i jednocześnie nie mieć pliku?

Masz dwa wyjścia - albo zapisz plik do katalogu tymczasowego (są do tego wygodne metody) albo napisz swój program, który będzie wyświetlał pobrane dane bezpośrednio z pamięci.

Dziękuję - właśnie o taką odpowiedz mi chodziło - teraz wszystko wiem :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1