Avatar billede limes_planum Praktikant
08. august 2012 - 13:44 Der er 13 kommentarer og
1 løsning

Permissions under Win7 - System.IO.Directory.CreateDirectory()

Når jeg publisher min consol-app, skal jeg have 'Grant permission' til at brugeren af min consola-apps-exe, ka bruge min app ordentligt.

Det kan brugeren ikke nu da, den System.IO.Directory.CreateDirectory()-funktion jeg bruger til at oprette mapper med i Visual Studio (hvor det virker under tests) ikke virker efter publish (når projektet er foldet ud som .exe-fil).

Jeg har prøvet at se om jeg via Win7-OS'dialogen kunne tildele mappen hvori den udfoldede exe-fil ligger 'Fuld kontrol' - men det er altså ikke nok? :-///

Hvad skal jeg gøre for at mapperne kan oprettes 'on-the-fly' som ønsket?
Avatar billede bvli Praktikant
08. august 2012 - 13:49 #1
Kører programmet lokalt hos brugeren, eller fra en delt drev på en server?
Avatar billede limes_planum Praktikant
08. august 2012 - 14:58 #2
Det kører lokalt, men det der er sket i mellemtiden er at jeg har opdaget at exe-filen faktisk opretter mapperne - bare skjult i selve mappen (endda så skjult at de ikke bliver synlige under OS-indstillingen; 'Vis skjulte mapper')

Hvordan kan jeg så se de bliver oprettet? ...
Når jeg går ind og oplister de .txt-filer jeg genererer i min exe-app, kan jeg se at de bliver oprettet da jeg kan åbne disse fra min exe-app under min 'Bilagstyring' ? :-s

Men tøv en kende.. da jeg netop har åbnet en af disse filer via notepad kan jeg jo se hvor de bliver gemt:

http://www.preforce.dk/div/fandt_mapperne.png

- Dog ikke den mest optimale sti (da jeg så skal til at forklare mig fra at stierne er så irrationelt langt væk), og hvorfor lægger den ikke bare mapperne ved siden af min udfoldede exe-fil? (spørgsmålet afføder således at jeg ønsker dette - "Hvad skal jeg gøre for at mapperne kan oprettes 'on-the-fly' som ønsket, SAMT OPRETTE MAPPERNE I DEN MAPPE HVORI EXE-FILEN LIGGER? ") [Ja, undskyld jeg 'råber', men man kan jo ikke skrive med en RTE herinde ... beklagligvis hehe..]
Avatar billede bvli Praktikant
08. august 2012 - 15:05 #3
Måske du skulle starte med at vise noget af det kode du bruger til at oprettet bibliotekerne med?
Avatar billede Syska Mester
08. august 2012 - 15:33 #4
Er det som click-once app?

Hvordan får brugeren programmet installeret?
Avatar billede limes_planum Praktikant
08. august 2012 - 16:07 #5
@ bvli: ok - men koden fungerer jo som ønsket i VS ... så jo,.. du får koden her, men spørgmålet ligger jo nu i, hvorfor VS smider mapperne et helt andet sted hen efter publish (.. og altså hvordan dette undgås .. men her er koden i hvert fald -> jeg giver dig helt medhold i at det måske kan hjælpe :)) (ved i hvert fald ikke selv bedre lige på den kant))

public List<string> Gem(List<string> salgObjLinjeModt, string KundLev)
        {
            //salgObjLinjeModt.ForEach(item => Console.Write("Items GemBilag: " + item));
            Console.WriteLine("salgObjLinjeModt[0]: " + salgObjLinjeModt[0]);
            Console.WriteLine("salgObjLinjeModt[1]: " + salgObjLinjeModt[1]);
            Console.WriteLine("salgObjLinjeModt[2]: " + salgObjLinjeModt[2]);
            string unikKundeKvittText;
            string samletVareSalg = "";

            //Initierer leverance med unik datotid
            DateTime BilagDatoHash = DateTime.Now; 
           
                // Specify a "currently active folder"
                string activeDir = @Directory.GetCurrentDirectory();

                //Create a new subfolder under the current active folder
                string newPath = System.IO.Path.Combine(activeDir, BilagDatoHash.Year + "_" + BilagDatoHash.Month + "_" + BilagDatoHash.Day);

                // Create the subfolder
                System.IO.Directory.CreateDirectory(newPath);

                // Lav et ny unik leverancebilag for hver leverance
                unikKundeKvittText = activeDir+"/"+BilagDatoHash.Year + "_" + BilagDatoHash.Month + "_" + BilagDatoHash.Day + "/" + BilagDatoHash.Year + "_" + BilagDatoHash.Month + "_" + BilagDatoHash.Day + "_Tid_" + BilagDatoHash.Hour + "_" + BilagDatoHash.Minute + "_" + BilagDatoHash.Second + "_KunKvitt.txt";
                TextWriter kktw = new StreamWriter(unikKundeKvittText);

                Console.WriteLine("unikKundeKvittText : " + unikKundeKvittText);

                foreach (string linje in salgObjLinjeModt)
                {
                    Console.WriteLine("linje: " + linje);
                    kktw.WriteLine(linje);
                }
                kktw.Close();

                return salgObjLinjeModt;
        }

- - -

@ buzz: spøjst at høre fra dig igen herinde :) ... Ja, i den udfoldede mappe ligger .application-filen (som exe-filen peger hen på) som click-once-app
Avatar billede bvli Praktikant
08. august 2012 - 17:37 #6
Men du bruger jo også eksplicit CurrentDirectory. Og det kan du jo af gode grunde ikke vide hvor er. Du bliver derfor nødt til at kalde CreateDirectory(...) med en absolut sti. Hvis du vil lave det i en, for brugeren let at komme til, lokation kan du evt. kigge på Environment.GetSpecialFolder(...), ellers kan du finde dit programs lokation vha. Path.GetDirectory(Assembly.GetExecutingAssembly().Location)
Avatar billede Syska Mester
08. august 2012 - 17:55 #7
Hvis det er ClickOnce installation og alt det ... så er det efter min mening bedst at gå efter noget ala:
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

Som bvli også er inde på ...

Jeg ved ikke hvorfor, men min post jeg skrev på arbejdet, må være gået tabt et sted.
Avatar billede Syska Mester
09. august 2012 - 08:24 #8
Her var den besked fra i går ... fik den åbenbart ikke submittet fra arbejdet:

Så bør du ikke gemme settings ved siden af din app, men i users app data folder.

http://blog.kowalczyk.info/article/Getting-user-specific-application-data-directory.html

Jeg synes da ikke at jeg har været væk ... :-) Men vi har måske snakket meget herinde eller bare mig der ikke lige kan huske så meget længere.

mvh
Avatar billede bvli Praktikant
09. august 2012 - 09:57 #9
Der er mange meninger om dette.. Man kunne/burde jo også hellere bruge IsolatedStorage.

Men det kommer jo også an på, om det er app-data eller user-data. Og hva' så når det - som i dette tilfælde - er eksport af data? Og hva' nu hvis programmet kører uden en user (service/scheduled), hvor skal det så hente sine settings fra og skrive dem til?

Anyway.. Det vigtige er nok, i denne situation, at brugeren kan finde de eksporterede data og har adgang til at kunne se dem. Og der er så flere muligheder:

1) Lad brugeren angive i hvilket bibliotek data skal eksporteres (som parameter til programmet)
2) Eksporter til brugerens Documents folder (evt. en underfolder heraf)
3) Eksporter til et aftalt sted på disk.

Jeg vil heller ikke mene at det er tilrådeligt at eksportere til et underbibliotek af programfolderen, da alm. brugere som regel ikke har adgang til dette.

Ad 1):

static void Main(string[] args)
{
if (args.Length > 0) {
  string folderPath = Path.GetFullPath(args[0]);
  if (Directory.Exists(folderPath))
  {
    //bla bla
    return;
  }
}
Console.WriteLine("Eksport folder ikke angivet.");
}

Ad 2)

string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyExportedFiles")
if (!Directory.Exists(folderPath))
{
  Directory.CreateDirectory(folderPath);
  //Bla bla
}


Ad 3)
string folderPath = @"C:\data\eksport"; //hent det evt. via Properties.Settings.DefaultSettings. Her understøttes både progam og user settings.
if (!Directory.Exists(folderPath))
{
  Directory.CreateDirectory(folderPath);
  //Bla bla
}
Avatar billede limes_planum Praktikant
09. august 2012 - 12:20 #10
ok, tak for komm. i lige den her omgang - svarer lidt mere helhjertet senere/måske først efter wkd'en..
Avatar billede limes_planum Praktikant
13. august 2012 - 12:04 #11
@blvi: Som sådan er der ingen udfoldning af programmet ved instalationsprocessen:

http://www.preforce.dk/div/heiraki.png

- så hvis der ikke er nogen udfoldning, skal jeg så bede brugeren om at vælge bibliotek i det afviklende consol-miljø (jf. Ad 1) )? Det lyder, i så fald, ret vanskeligt at gøre nemt for brugeren ..
(grunden til at jeg bruger en consol-app og ikke forms er dårlige erf. med signing-helvede)

Til Ad 2) og/eller Ad 3): Hælder mest til at oprette en mappe (if !excist-agtigt) i et subbibl. under 'Dokumenter' (vil i så fald consolwriteline til brugeren at denne mappe bliver oprettet, når dataene gemmes)

Til det omkring IsolatedStorage/ app-data eller user-data, så havde jeg om dette på et MCPD-kursus, så kan være jeg lige sku prøve at tage den bog ned af hylden, da det ik lige er noget jeg huske soleklart...

- - -

@buzz: [Referrede bare til et af de sidste spørgsmål jeg havde oprettet, hvor du også svarede :) (intet mer-mystik der.. hehe)]

- - -

Til begge: Men samlet set tror jeg min løsning ligger i den specifikke folder-oprettelse (som Buzz også henviser til) - (.. og helst under 'Dokumenter') - har dog lige et lille aber dabei; hedder mappen 'Dokumenter' (dansk-os) så 'Documents' i grund-os'en (consol-miljøet) (forhåbentlig skal jeg ikke ud i en eller anden 'Documents and settings'-sti :-/)
Avatar billede bvli Praktikant
13. august 2012 - 12:11 #12
Gvis du kigger i eksempel 2) i mit tidligere svar, vil du se, at jeg bruger en - af .net defineret - enum og en tilhørende metode, til at hente foldernavnet for "My documents". Den virker nemlig på alle OS'er og alle sprog.

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

:)
Avatar billede limes_planum Praktikant
15. august 2012 - 09:48 #13
Det virker - smid et svar :)
Avatar billede bvli Praktikant
15. august 2012 - 09:52 #14
Værsgo' :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester