Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [VB.NET]Problema scrittura file: file già in uso da un altro processo (?)

    Salve a tutti!

    Giorni fa ho cominciato a scrivere un programma da "distribuire" ai miei utenti, con funzione di registrazione/login. Portando avanti il progetto, sono stato costretto a realizzare un installer che un installer non è: ho sfruttato tutte le classi che avrei potuto usare per creare e scrivere i file. Il problema sta in una fase dell'installazione... comincio da principio:

    - Creo tre file .phx (mia estensione, letta come .txt), e scrivo su uno di essi. "logged.phx" per far sì che il programma possa capire se il login è stato fatto o meno, "user.phx" contenente i dati inseriti alla registrazione, "lpath.phx" contenete la "directory di lavoro" del programma. Scrivo solo sull'ultimo dei tre...

    codice:
    Imports System.IO.File
    
    Dim name1 As String = "logged.phx"
    Dim name2 As String = "user.phx"
    Dim name3 As String = "lpath.phx"
    
    'Scrivo la parte di codice interessata
    TextBox1.Text = TextBox1.Text & vbCrLf & "Creo file: " & name1
                Create(name1)
                TextBox1.Text = TextBox1.Text & vbCrLf & "Creo file: " & name2
                Create(name2)
                TextBox1.Text = TextBox1.Text & vbCrLf & "Creo file: " & name3
                Create(name3)
    
    Dim writer As New IO.StreamWriter("lpath.phx")
                writer.Write(Environment.CurrentDirectory)
                writer.Close()
    Ok, il codice dà errore in questa riga:
    codice:
    Dim writer As New IO.StreamWriter("lpath.phx")
    "File già in uso da un altro processo."

    Da quale processo può mai essere usato? Non ci sono altri StreamWriter, quindi il rischio che ve ne sia uno già aperto non c'è. Allego anche il codice per intero, magari il problema sta altrove...

    codice:
    Imports System.IO.File
    Public Class Form2
        Dim time As Integer = 10 'Variabile per un countdown
        Dim time2 As Integer = 1 'Vedi il commento su
        Dim name1 As String = "logged.phx"
        Dim name2 As String = "user.phx"
        Dim name3 As String = "lpath.phx"
        Dim path As String
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
            time = time - 1
            Label2.Text = time
            If time = 0 Then
                Label2.Text = ""
                Label1.Text = "Installazione avviata."
                Timer1.Stop()
                'Uso il timer per fare l'installazione...
                If Form1.TextBox1.Text = "C:\Users\" & Environment.UserName & "\COD_Wii_Clans" Then
                    TextBox1.Text = TextBox1.Text & vbCrLf & "Imposto cartella di lavoro: " & "C:\Users\" & Environment.UserName
                    Environment.CurrentDirectory = "C:\Users\" & Environment.UserName
                End If
                TextBox1.Text = TextBox1.Text & vbCrLf & "Imposto cartella di lavoro: " & Form1.TextBox1.Text
                Environment.CurrentDirectory = Form1.TextBox1.Text
                TextBox1.Text = TextBox1.Text & vbCrLf & "Creo directory: " & Form1.TextBox1.Text
                MkDir(Form1.TextBox1.Text & "\COD_Wii_Clans")
                Environment.CurrentDirectory = Form1.TextBox1.Text & "\COD_Wii_Clans"
                path = Form1.TextBox1.Text & "\COD_Wii_Clans"
                TextBox1.Text = TextBox1.Text & vbCrLf & "Creo file: " & name1
                Create(name1)
                TextBox1.Text = TextBox1.Text & vbCrLf & "Creo file: " & name2
                Create(name2)
                TextBox1.Text = TextBox1.Text & vbCrLf & "Creo file: " & name3
                Create(name3)
                FileClose() 'Tento di chiudere tutti i processi in modo bruto, niente da fare. 
                TextBox1.Text = TextBox1.Text & vbCrLf & "Definisco files precedentemente creati..."
                TextBox1.Text = TextBox1.Text & vbCrLf & "Scarico eseguibile e librerie correlate..."
                Timer2.Start()
                Reset() 'Tento di chiudere tutti i processi in modo bruto, niente da fare. 
            End If
        End Sub
    
    
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer1.Start()
        End Sub
    
        Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            time2 = time2 - 1
            If time2 = 0 Then
                Timer2.Stop()
                Reset() 'Tento di chiudere tutti i processi in modo bruto, niente da fare. 
    
                Dim writer As New IO.StreamWriter("lpath.phx")
                writer.Write(Environment.CurrentDirectory)
                writer.Close()
                My.Computer.Network.DownloadFile("http://phoenixstyle.altervista.org/Call_of_Duty_Wii_Clan/COD_Wii_Clans.exe", path & "\COD_Wii_Clans1.0a2.exe")
    
            End If
        End Sub
    End Class
    Suggerimenti? Grazie anticipatamente per eventuali risposte!

  2. #2
    Problema risolto, smanettandoci un po'. Ho portato la variabile:

    codice:
    Dim writer as New StreamWriter
    in cima al codice, insieme alle altri variabili "globali" dichiarate. Potreste spiegarmi il motivo della soluzione? Ve ne sarei infinitamente grato!

    Come non detto Al momento del debug non mi viene dato alcun errore, ma dentro al file non viene scritto assolutamente nulla... essendo la variabile dichiarata prima che il file "lpath.phx" venga creato, no? Se così fosse, si torna al problema di prima...

    Update: stesso errore anche con:

    codice:
    My.Computer.FileSystem.WriteAllText("lpath.phx", path, False)
    Perdonate la confusione creata... ho trovato la causa, ed a quanto pare si tratta di "Create(name3)". Sfruttando la possibilità di "WriteAllText" di generare il file nel caso in cui non esistesse, ho risolto il problema. La domanda è questa: una volta creato un file con "System.IO.Files.Create()", bisogna chiuderlo (?) ? Se sì, in che modo (né Reset() né FileClose() hanno funzionato) ?

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    119
    Le risorse vanno sempre rilasciate.
    Se non avviene automaticamente è necessario insere delle istruzioni nel codice.
    Impostando a nothing gli oggetti creati ed eventualmente richiamando "dispose" (se l'oggetto implementa idisposable;

  4. #4
    Grazie, cyanuro. Non credo di aver capito tanto bene, però :\

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Usa

    codice:
       Dim fs As FileStream = Create(name3)
       fs.Close()
    ovviamente con

    Imports System.IO
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.