FileStream otwieranie

FileStream otwieranie
Pawci_o
  • Rejestracja:ponad 9 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Czudec
  • Postów:59
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:

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

proszę o pomoc.

MA
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:24
0

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

edytowany 1x, ostatnio: Makciek
Pawci_o
  • Rejestracja:ponad 9 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Czudec
  • Postów:59
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?

MA
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:24
0

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

edytowany 1x, ostatnio: Makciek
Pawci_o
  • Rejestracja:ponad 9 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Czudec
  • Postów:59
0

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

Kopiuj
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.

Kopiuj
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:

Kopiuj
 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ć:

Kopiuj
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.

MA
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:24
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
?

edytowany 3x, ostatnio: Makciek
Pawci_o
  • Rejestracja:ponad 9 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Czudec
  • Postów:59
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 ;)

Kubuś Puchatek
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:235
0

do otwierania plików jak masz txt użyj

Kopiuj
StreamReader

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


Lubię miodek :)
MA
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad rok
  • Postów:24
0

Powinno być tak:

Kopiuj
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

edytowany 3x, ostatnio: Makciek
Pawci_o
  • Rejestracja:ponad 9 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Czudec
  • Postów:59
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...

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
  • Lokalizacja:Wrocław
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?

Pawci_o
  • Rejestracja:ponad 9 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Czudec
  • Postów:59
0

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

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
  • Lokalizacja:Wrocław
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.

Pawci_o
  • Rejestracja:ponad 9 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Czudec
  • Postów:59
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 :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.