Plik w katalogu plików tymczasowych

0

Witajcie. Potrzebuję przenieść plik do temp, ale tylko na czas działania aplikacji. Po zamknięciu aplikacji plik ma zostać usunięty. Dodatkowo chciałbym, aby podczas działania aplikacji plik ten nie mógł zostać skopiowany/otworzony przez użytkownika w inny sposób, niż tylko przez tą aplikację (jak to osiągnąć? może blokując całkowicie dostęp do katalogu temp, tylko jak to zrobić?).

Proszę was o pomoc. Kompletnie nie mam pomysłu jak to wszystko napisać.

1

Jeśli otworzysz ten plik na wyłączność, to nikt nie będzie miał do niego dostępu, trzeba użyć odpowiedniego konstruktora FileStream z FIleShare.None, o ile dobrze pamiętam.
Usuwanie pliku to FIle.Delete(ścieżka).

0

A jak to tak dokładnie zrobić? Mógłby ktoś podać mi gotowy kod? Na razie mam coś takiego:

string tempFile = Path.GetTempFileName();
File.WriteAllBytes(tempFile, Properties.Resources.guide2);
this.axAcroPDF1.LoadFile(tempFile);
0

A ty znowu z tym pdf :)
Hmmm dokumentacja adobe jest porażająca. http://livedocs.adobe.com/acrobat_sdk/9.1/Acrobat9_1_HTMLHelp/wwhelp/wwhimpl/common/html/wwhelp.htm?context=Acrobat9_HTMLHelp&file=IAC%5FAPI%5FOLE%5FObjects.103.175.html
Niestety wygląda na to że można otworzyć tylko plik za pomocą podania do niego ściezki, nie można podać strumienia.
Wydaje mi się, że kontrolka po załadowaniu pliku może go zablokować do odczytu. Ewentualnie sprawdź czy po załadowaniu pliku kontrolka jeszcze go potrzebuje, po prostu spróbuj go usunąć, może po załadowaniu do pamięci już jej nie potrzebny plik.
Ewentualnie przygotuj guide w innym formacie, np. html i wyświetl w kontrolce webbrowser. Albo stwórz plik pomocy i wystybuuj go z aplikacją.

0

@massther - kontrolka ani nie używa załadowanego pliku, ani go niestety nie blokuje, trzeba to zrobić samemu.

using System;
using System.IO;
using System.Windows.Forms;

namespace ARTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string tempFilePath;
        FileStream fsTemp;

        private void button1_Click(object sender, EventArgs e)
        {
            // zapisujemy PDF do pliku tymczasowego
            this.tempFilePath = Path.GetTempFileName();
            File.WriteAllBytes(this.tempFilePath, Properties.Resources.guide);

            // otwieramy go w kontrolce
            this.axAcroPDF1.LoadFile(this.tempFilePath);

            // blokujemy plik
            this.fsTemp = new FileStream(this.tempFilePath, FileMode.Open, FileAccess.Read, FileShare.None);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            // odblokowujemy plik
            if (this.fsTemp != null)
            {
                this.fsTemp.Dispose();
            }

            // usuwamy plik
            if (File.Exists(this.tempFilePath))
            {
                File.Delete(this.tempFilePath);
            }
        }
    }
}

Głupie to jak but, ale niby działa.

Tylko moim zdaniem sam pomysł wbudowywania pdf w aplikację po to, aby go ukrywać przed użytkownikiem jest chybiony.

0

Wielkie dzięki. Ale dlaczego chybiony? Tworząc pdfa wyłączyłem możliwość kopiowania jego treści oraz drukowania go. Wbudowałem pdfa w aplikację, w której użytkownik loguje się danymi (połączone z mysqlem) i dopiero wtedy jest mu wyświetlany pdf, z zablokowaną możliwością zapisy, drukowania, kopiowania (może go tylko przeglądać).

Wydaje mi się, że jest to dobre zabezpieczenie przed kopiowaniem.

0

o jejku, nawet blondynki słyszały o print screen :D

0

Można zablokować ten klawisz, prawda?

0

no nie, może lepiej od razu wyłącz userowi monitor :D
jeśli masz pdf zabezpieczony przed kopiowaniem i drukowaniem, to na większość użytkowników wystarczy, a ta mniejszość jak będzie zawzięta, to nawet z czarami z print screen sobie poradzi, a ty utrudniasz sobie życie
a w ogóle pisząc w .net jak dasz nam swój program to sobie go zdeasemblujemy (łącznie z zasobami) i tyle, oczywiście możesz użyć obfuscator'a i utrudnić życie chcącym to zrobić

0

Czego przepraszam użyć? ;d

0

używałeś kiedyś .NET Reflector? teraz to już soft od Red Gate, pozwala deasemblować assembly .net'owe (dll i exe) i oglądać ich kod :)
a o obfuscatorach poczytaj na wiki http://pl.wikipedia.org/wiki/Zaciemnianie_kodu
i wersja en http://en.wikipedia.org/wiki/Obfuscated_code

0

Ok, już zabezpieczyłem =). Teraz powinno być chyba ok. Dziękuję, że mnie o tym poinformowaliście. Tak to żyłbym w niewiedzy, myśląc, że mój pliczek jest bezpieczny...

0

Wystarczy zabić proces, żeby dostać się do pliku z tempa.

Chybiony, bo nie ma sensu używać w tym celu pliku PDF. Już lepiej tę treść zapisać jako obrazki w aplikacji i wyświetlić w PictureBox, odpadnie słabe ogniwo z plikiem tymczasowym.

0

Nie prawda, zabiłem proces i do pliku nadal nie ma dostępu (w tle otwierany jest Adobe Reader który cały czas używa tej aplikacji). Otworzyłem plik temp, zabiłem proces i nadal nie mogłem otworzyć pdfa. Dopiero jak zabiłem tego Adobe Readera, to teoretycznie bym mógł, ale wówczas plik tymczasowy się usuwa =). Nie wiem jak ja to zrobiłem, ale próbowałem na wszystkie możliwe sposoby skopiować/otworzyć pdfa w tempie i nie dało rady.

Dlaczego pdf, a nie obrazki? Proste, pdf ma rozdziały! Mam OLBRZYMIEGO pdfa i muszę dać użytkownikowi jakieś opcje nawigacji.

0

Twierdzisz, że lepiej ode mnie wiesz, co ja zrobiłem na swoim kompie? [rotfl]

Bez problemu zabijam proces i dostaję się do uwolnionego już pliku z tempa. Oczywiście możesz w to nie wierzyć i uważać, że jesteś w pełni zabezpieczony.

0

Ah, zapomniałem powiedzieć że troszeczkę zmieniłem twój kod.

            
            string tempFile = Path.GetTempFileName();
            File.WriteAllBytes(tempFile, Properties.Resources.guide);
            this.axAcroPDF1.setShowToolbar(false);
            this.axAcroPDF1.LoadFile(tempFile);
            File.Delete(tempFile);

Plik usuwany jest od razu po załadowaniu. Nie ma go nigdzie. Z kolei pliku tymczasowego, tworzonego przez Adobe Readera nie można otworzyć, nawet jeśli zabije się proces.

0

[sciana]
To mów od razu, że używasz innego kodu. :|
Ale jak się tak da, to jeszcze lepiej, znacznie lepiej niż napisałem w swoim kodzie.

1

@Purpen - Ale wiesz że jeśli komuś będzie zależało to po prostu przejedzie reflectorem twój program i mimo wszystkich zabezpieczeń dostanie się do twojego tajnego pliku?

0

Tak, ktoś o tym już wspomniał ;). I o obfuscatorach też.

0

Słuchajcie, mam jeszcze jeden problem. Gdy w pdfie mam bardzo dużo linków do stron internetowych. Gdy otwieram pdfa normalnie, nie poprzez załadowanie go w mojej aplikacji, linki bez problemu się otwierają. Gdy jednak ładuję pdfa do mojej aplikacji, po kliknięciu na link nic się nie dzieje. W czym tkwi problem?

0

Może ta kontrolka nie obsługuje klikania w linki?

0

Kurczę, szkoda :/. Nie mogę znaleźć żadnych innych, porządnych i darmowych... wszystko płatne.

0

No niestety. Dlatego pdf to chybiony pomysł, od razu mówiłem. ;P

Zastanawiam się, czy nie lepsze byłoby osadzenie pomocy w formacie HTML w kontrolce WebBrowser, albo użycie chm.

0

Właśnie załadowałem pdfa do WebBrowsera. Pięknie otwiera linki (przechwytuję jeśli użytkownik naciśnie na hiperłącze i otwieram wówczas link w przeglądarce) i dodatkowo przesunąłem WebBrowsera troszkę poza formę, aby schować toolbar Adobe Readera (dzięki temu nie można zapisać pliku na dysk).

0

A czy do WebBrowsera da radę zładować plik z resources? Jeśli tak, to jak?

0

Już dawno byś to zrobił w HTMLu lub RTF...

0

No dobra, załóżmy że będę miał wszystko w pliku .html. Co wtedy?

0

Od razu do webbrowser, bez żadnego zapisu na dysk. DocumentStream, DokumentText, Document.Write(...)

0

Ok, dzięki wielkie. Niestety, wszystkie konwertery pdf->html rozwalały cały układ, dlatego zmuszony jestem do skorzystania z pliku .doc. Jak sprawa wygląda w tym wypadku? Do czego mam go wrzucić? Też do webbrowsera?

0

Mam plik doc. Jak mogę go załadować do kontrolki i zabezpieczyć przed zapisem/drukowaniem?

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