Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: txt tiedostoon kirjoittaminen print-komennolla ei toimi Vistassa

Filerator [06.01.2009 21:28:04]

#

Morjes,
XP:ssä tämä on toiminut, mutta Vista ei jostain syystä anna kirjoittaa txt-tiedostoon. Vista kyllä avaa tiedoston, mutta esimerkin koodi muuttujan tekstit ei tallennu.

Dim koodi$

Close #1
Open App.path & "\koodit\data.txt" For Output As #1
Print #1, koodi
Close #1

Dim polku$
polku = App.path & "\koodit\data.txt"
openfile (polku)

Mistä johtuu ja mikä avuksi (Vb 6)?

Mod. lisäsi kooditagit

Grez [06.01.2009 21:49:44]

#

Ootko jo katsonut mitä tiedostosta

c:\users\{käyttäjänimesi}\appdata\local\VirtualStore\Program Files\{ohjelmasi nimi}\koodit\data.txt

löytyy ?

Jos kaipaamasi data on tuolla, niin aiheuttaja on Vistan data redirection/virtualization. Avuksi on joko siirtää ne tiedostot sinne missä niiden pitäisikin olla (APPDATA tms) tai jos on ihan pakko sitä Program Files hakemistoa käyttää niin käytä API-kutsuja tiedostojen käsittelyyn ja määrittele CreateFilelle sopiva security descriptor.

Filerator [06.01.2009 22:29:37]

#

Kiitos,

Lähti pelaan kun siirsi pois Program Files -kansiosta.

Jos joku kuitenkin asentaa välttämättä sovelluksen defaultista huolimatta Program files -kansioon, niin voitko laittaa vielä esimerkin mainitsemastasi API-kutsun ja security descriptorin käytöstä.

Grez [06.01.2009 22:45:37]

#

Paljon parempi ratkaisu on tallentaa ne tiedostot sinne minne ne pitäisi tallentaa (datahakemistoon) eikä siihen hakemistoon johon ohjelma on asennettu.

Private Declare Function SHGetFolderPath Lib "shFolder" _
        Alias "SHGetFolderPathA" (ByVal hwndOwner As Long, _
        ByVal nFolder As Long, ByVal hToken As Long, _
        ByVal dwFlags As Long, ByVal pszPath As String) As Long

Private Const CSIDL_APPDATA = &H1A
Private Const CSIDL_FLAG_CREATE = &H8000&
Private Const MAX_PATH = 260
Private Const SHGFP_TYPE_CURRENT = &H0

Public Function GetAppDataPath() As String
    Dim sz As String

    sz = Space(MAX_PATH)
    If SHGetFolderPath(0, CSIDL_APPDATA Or CSIDL_FLAG_CREATE, 0, _
            SHGFP_TYPE_CURRENT, sz) <> 0 Then Exit Function

    GetAppDataPath = Left$(sz, InStr(1, sz, Chr(0)) - 1) & "\" & App.Title
    If Dir(GetAppDataPath, vbDirectory) = "" Then MkDir GetAppDataPath
End Function

Private Sub FileratorinKoodi()
    Dim Koodi As String, FileId As Integer

    If Dir(GetAppDataPath & "\koodit", vbDirectory) = "" Then MkDir GetAppDataPath & "\koodit"
    FileId = FreeFile
    Open GetAppDataPath & "\koodit\data.txt" For Output As #FileId
    Print #FileId, Koodi
    Close #FileId
End Sub

Filerator [09.01.2009 13:47:38]

#

Morjes,

No nyt toimii niin kuin pitääkin.
Tuhannet kiitokset.

Hienoa että joku viitsii neuvoa amatööriä.

T: Filerator

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta