Newsgroup: it.comp.lang.visual-basic
Titolo: Troncare un file... File temporanei

Sono un programmatore (quasi) alle prime armi e ho un very big problema...
Se io devo tagliare da un file di 5Mb gli ultimi due Kb... Sono proprio
costretto a:
-Copiare il vecchio file in un nuovo file tranne gli ultimi 2 Kb
-Chiudere i files
-Eliminare il vecchio e rinominare il nuovo?
Qualcuno può illuminarmi?
Inoltre credo che da qualche parte ci sia un'API per ottenere dal sistema il
nome di un file temporaneo e/o la directory Temp di Windows... Mi potreste
dare la dichiarazione? Grazie a tutti...

 dare la dichiarazione? Grazie a tutti...
eccoti il codice per avere il nome di un file temporaneo, che utilizza l'API
di cui parlavi.
va incollato in un codice di classe (clsTemp)
Private Declare Function GetTempFileName Lib "kernel32" _
    Alias "GetTempFileNameA" _
    (ByVal lpszPath As String, _
    ByVal lpPrefixString As String, _
    ByVal wUnique As Long, _
    ByVal lpTempFileName As String) As Long
Private Const TF_FORCEDRIVE = &H80
Private mvarTempDir As String
Private Sub Class_Initialize()
    mvarTempDir = Environ("TEMP")
    If mvarTempDir = vbNullString Then mvarTempDir = "C:\"
End Sub
Public Property Get Name() As String
    Dim rc As Long
    Dim lpszPath As String
    Dim lpPrefixString As String
    Dim wUnique As String
    Dim lpTempFileName As String
    lpszPath = mvarTempDir
    lpPrefixString = "t"
    wUnique = 0
    lpTempFileName = Space(255)
    rc = GetTempFileName(lpszPath, lpPrefixString, wUnique, lpTempFileName)
    Name = Trim(lpTempFileName)
    rc = 0
End Property
'per vedere come funziona prova a fare cosě:
'(magari nell'evento Click di un Command Button)
    Dim Temp As clsTemp
    Set Temp = New clsTemp
    MsgBox Temp.Name, vbInformation
    Set Temp = Nothing
Ciao!
Faber

Cutttttt.....
forse è un'idea non molto brillante ma ...
se apri il file in modalità binaria e lo leggi al contrario?
Così devi leggerti solo 2k!   ;-)
--
_.-°\ClaudiO/°-._
Lavorare per lavorare meno è meglio.


Per il primo quesito (all'altra ti hanno risposto....) vedi se ti puo'
piacere questa soluzione :
Apri il file in binario e scrivi TU nella posizione che vuoi i caratteri di
fine file. E' una mezza porcheria ma funziona... anche se ci sono delle
controindicazioni che ti salteranno subito all'occhio.... ;o)
inoltre.... con questi file poi cosa ci devi fare ?? con cosa li dovrai
leggere ???
Altrimenti devi leggerti il file (consiglio sempre di aprirlo in binary
mode) magari a blocchi vista la grandezza e riscriverlo fino al byte che ti
serve.
Ciao
Ven.

 -Eliminare il vecchio e rinominare il nuovo?
In VB non ci sono strumenti per ridurre le dimensioni di un file. Esiste
invece la possibilità utilizzando gli interrupt che però sono richiamabili
solo da C o ASM.
----------------------------------------------------------------------
Stefano Minardi
Zetesis: 
zet...@mclink.it
----------------------------------------------------------------------

GRAZIE a TUTTI...

 Se io devo tagliare da un file di 5Mb gli ultimi due Kb...
Usa l'api SetEndOfFile. La faccenda è pero un po' complessa perchè questa
API necessita di un handle al file, che non puoi ottenere se apri il file da
VB.
Devi allora usare l'API CreateFile per aprirlo (non ti fare ingannare dal
nome, serve anche per aprire files già esistenti), poi la SetFilePointer per
andare al punto dove vuoi troncarlo, poi la SetEndOfFile per troncarlo e la
FileClose per chiuderlo.
Ecco qui il risultato, in mezzo alle 2 righe di forbici.
--- 8< --- 8< --- 8< --- 8< --- 8< --- 8< --- 8< --- 8< --- 8< --- 8< ---
8< --- 8<
' Crea una form. Inserisci il classico pulsante Command1,
' e poi incolla il codice seguente
Option Explicit
Private Declare Function CreateFile _
     Lib "kernel32" Alias "CreateFileA" _
    (ByVal lpFileName As String, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    ByVal lpSecurityAttributes As Long, _
    ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle _
    Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function SetEndOfFile _
    Lib "kernel32" _
   (ByVal hFile As Long) As Long
Private Declare Function SetFilePointer _
    Lib "kernel32" _
    (ByVal hFile As Long, ByVal lDistanceToMove As Long, _
     lpDistanceToMoveHigh As Long, _
     ByVal dwMoveMethod As Long) As Long
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const FILE_BEGIN = 0
Private Const sNomeFile = "C:\pippo.txt"
Private Sub Command1_Click()
Dim lHandleDelFile As Long
Dim PosizioneACuiVuoiTroncare As Double
Dim Risposta As Long
lHandleDelFile = CreateFile(sNomeFile, GENERIC_WRITE, _
     FILE_SHARE_READ Or FILE_SHARE_WRITE, _
     ByVal 0&, OPEN_EXISTING, 0, 0)
If lHandleDelFile >-1 then
  PosizioneACuiVuoiTroncare = 5! * 1024! * 1024! - 2! * 1024! ' (5Mb - 2Kb)
  ' Questa API accetta l'offset come parte bassa a 32 bit + parte alta a 32
bit
  ' Nel caso specifico, della parte alta ce ne freghiamo
  Risposta = SetFilePointer(lHandleDelFile, PosizioneACuiVuoiTroncare, _
    0, FILE_BEGIN)
   Risposta = SetEndOfFile(lHandleDelFile)
   Risposta = CloseHandle(lHandleDelFile)
Else
    MsgBox "Il file non esiste"
Endif
End Sub
--- 8< --- 8< --- 8< --- 8< --- 8< --- 8< --- 8< --- 8< --- 8< --- 8< ---
8< --- 8<
Ecco tutto
*Roby*
P.S.
In un impeto di curiosità l'ho pure provata, e funziona. Attenzione che il
file deve esistere, altrimenti non fa nulla.