Datei mit fester Größe erstellen

Anfängerfragen zum Programmieren mit PureBasic.
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi,

danke für die Info. Ich habe es dann mit PB 4.0 mal ausprobiert.

Wenn ich eine Datei erstellen lasse, z.B. 10 MB möchte ich die TrackBarList
in dem Fenster anzeigen, damit man sieht, dass das Programm noch arbeitet.
Im Moment erreicht die TrackBar jedoch das Ende viel zu schnell, obwohl
der Vorgang des Erstellens noch nicht abgeschlossen wurde.

Hat da jemand noch eine Idee, was ich da machen kann?

Ich habe mal den Code (PB 4.0) mit beigehängt.

Code: Alles auswählen

; -- DECLARATION ---
Declare initInfo()
Declare setInfos()
Declare disableInfos(flag)
Declare crtFile()

; -- GLOBAL ---
Global Free.q
Global Total.q

; -- ENUMERATION ---
Enumeration
  #MAIN
  #LIST
  #FULL
  #SPECIFIC
  #TRACKBAR
  #HIGH
  #SAVEFILE
  #FSIZE
  #BTN_CRT
  #BTN_QUIT
  #PROGBAR
  #SIZELIST
EndEnumeration

dName.s
VName.s
FSName.s
*Buffer = AllocateMemory(255)
VName = Space(255)
FSName = Space(255)

; -- STRUCTURE FOR DISC SIZE ---
Structure int64
  Long1.l
  Long2.l
EndStructure

Procedure.s getDriveType(parameter.s)

  result.s
  
  Select GetDriveType_(parameter)
    Case 2 : result = "Removable Drive"
    Case 3 : result = "Fixed Drive"
    Case 4 : result = "Remote (Network)"
    Case 5 : result = "CDRom Drive"
    Case 6 : result = "RAM Drive"
    Default : result = "Unknown"
  EndSelect

  ProcedureReturn result

EndProcedure

Procedure initInfo()

  frmID = Frame3DGadget(#PB_Any, 10, GadgetHeight(#LIST) + 20, GadgetWidth(#LIST), 180, "Partition Information") 
    
    OptionGadget(#FULL, 20, 195, 140, 20, "Use Full Free Size") 
    OptionGadget(#SPECIFIC, 20, 220, 140, 20, "Use Size") 
      TrackBarGadget(#TRACKBAR, 160, 225, 500, 18, 0, 100) 
        TextGadget(#PB_Any, 165, 250, 10, 20, "0")
        TextGadget(#HIGH, 650, 250, 100, 20, "100")
        
    TextGadget(#PB_Any, 20, 280, 120, 20, "File Size (MB):")
    StringGadget(#FSIZE, 165, 280, 120, 20, "")
        
    TextGadget(#PB_Any, 20, 310, 120, 20, "File Path/Name:")
    StringGadget(#SAVEFILE, 165, 310, 490, 20, "", #PB_String_ReadOnly)
    
    ButtonGadget(#BTN_CRT, 10, 360, 60, 20, "Create") 
    ButtonGadget(#BTN_QUIT, 80, 360, 60, 20, "Quit") 

    ProgressBarGadget(#PROGBAR, 10, 390, GadgetWidth(#LIST), 30, 0, 100) 
    
    disableInfos(0)

EndProcedure

Procedure setInfos()

  SetGadgetAttribute(#TRACKBAR, #PB_TrackBar_Maximum, Val(GetGadgetItemText(#LIST, GetGadgetState(#LIST), 5)))
    SetGadgetText(#HIGH, GetGadgetItemText(#LIST, GetGadgetState(#LIST), 5))
    SetGadgetText(#FSIZE, GetGadgetItemText(#LIST, GetGadgetState(#LIST), 5))
    
  SetGadgetText(#SAVEFILE, GetGadgetItemText(#LIST, GetGadgetState(#LIST), 0) + "MEMORYTEST.DAT")


EndProcedure

Procedure disableInfos(flag)

  Select flag
    Case 0
      DisableGadget(#BTN_CRT, 1) : DisableGadget(#FULL, 1) : DisableGadget(#SPECIFIC, 1)
      DisableGadget(#TRACKBAR, 1) : DisableGadget(#SAVEFILE, 1) : DisableGadget(#FSIZE, 1)
    Case 1
      DisableGadget(#BTN_CRT, 0) : DisableGadget(#FULL, 0) : DisableGadget(#SPECIFIC, 0)
      DisableGadget(#TRACKBAR, 1) : DisableGadget(#SAVEFILE, 0)
      SetGadgetState(#FULL, 1)
    Case 2
      DisableGadget(#TRACKBAR, 0) : DisableGadget(#FSIZE, 0)
      SetGadgetState(#TRACKBAR, Val(GetGadgetItemText(#LIST, GetGadgetState(#LIST), 5)))
    Case 3
      DisableGadget(#TRACKBAR, 0) : DisableGadget(#FSIZE, 1)
      SetGadgetState(#TRACKBAR, Val(GetGadgetItemText(#LIST, GetGadgetState(#LIST), 5)))
      SetGadgetText(#FSIZE, GetGadgetText(#HIGH))
    Case 9
      DisableGadget(#BTN_CRT, 1) : DisableGadget(#FULL, 1) : DisableGadget(#SPECIFIC, 1)
      DisableGadget(#TRACKBAR, 1) : DisableGadget(#FSIZE, 1) : DisableGadget(#LIST, 1) : DisableGadget(#BTN_QUIT, 1)
    Case 10
      DisableGadget(#BTN_QUIT, 0) : DisableGadget(#LIST, 0)
  EndSelect

EndProcedure

Procedure crtFile()
    
    CreateFile(1, GetGadgetText(#SAVEFILE))
    k.q = Val(GetGadgetText(#FSIZE)) * 1024 * 1024

    For a = 0 To k
       SetGadgetState(#PROGBAR, a)
       WriteByte(1,0)
    Next
    CloseFile(1)

EndProcedure

; ---- START MAIN PROGRAM ----

hWnd = OpenWindow(#MAIN, 0, 0, 820, 390, "Memory Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

If hWnd <> 0
  CreateGadgetList(WindowID(#MAIN))
  ListIconGadget(#LIST,  10, 10, 800, 150, "#", 50, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines)
    AddGadgetColumn(#LIST, 2, "Volume Name", 170)
    AddGadgetColumn(#LIST, 3, "File System", 80)
    AddGadgetColumn(#LIST, 4, "Drive Type", 150)
    AddGadgetColumn(#LIST, 5, "Total Size (MB)", 110)
    AddGadgetColumn(#LIST, 6, "Free Size (MB)", 110)

    For i = 0 To GetLogicalDriveStrings_(255, *Buffer)
      C = PeekB(*Buffer + i)
      If C > 64 And C < 91
        dName = Chr(C) + ":\"
        If GetVolumeInformation_(dName, VName, 255, Serial, 0, 0, FSName, 255)
        
        GetDiskFreeSpaceEx_(@dName, BytesFreeToCaller.int64, TotalBytes.int64, TotalFreeBytes.int64)
        Total = ((TotalBytes\Long1 >> 20) & $FFF) | (TotalBytes\Long2 << 12)
        Free = ((TotalFreeBytes\Long1 >> 20) & $FFF) | (TotalFreeBytes\Long2 << 12)
        
        AddGadgetItem(#LIST, -1, dName + Chr(10) + VName + Chr(10) + FSName + Chr(10) + getDriveType(dName) + Chr(10) + Str(Total) + Chr(10) + Str(Free))
        
        EndIf
      EndIf  
  
    Next

    initInfo()

EndIf

Repeat
  EventID = WaitWindowEvent()

  Select EventID
    Case #PB_Event_CloseWindow
      Quit = 1
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #LIST
          disableInfos(1)
          setInfos()
        Case #SPECIFIC
          disableInfos(2)          
        Case #FULL
          disableInfos(3)
        Case #TRACKBAR
          SetGadgetText(#FSIZE, Str(GetGadgetState(#TRACKBAR)))
        Case #FSIZE
          If EventType() = #PB_EventType_LostFocus
            SetGadgetState(#TRACKBAR, Val(GetGadgetText(#FSIZE)))
          EndIf
        Case #BTN_QUIT
          Quit = 1
        Case #BTN_CRT
          disableInfos(9)
          ResizeWindow(#MAIN, #PB_Ignore , #PB_Ignore , #PB_Ignore , 430) 
          Delay(500)
          crtFile()
          Delay(500)
          disableInfos(10)
          ResizeWindow(#MAIN, #PB_Ignore , #PB_Ignore , #PB_Ignore , 390) 
      EndSelect
  EndSelect

Until Quit = 1
Zur Zeit setze ich den Status der TrackBar in der Prozedur "crtFile()".

Danke + Gruß,
Daniel
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

Ääh, will nicht stören,
trotzdem kurze Frage:

Bei 3.3 gibbts nix höheres als LONG (2^32) oder? :(
Bild
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Code: Alles auswählen

Procedure      ResizeFile (Filename.s, NewLength.l )
  ; Set new FileSize. Attention only for Size of 2^32 Bytes!!
  ; by Rings
  Filehandle = CreateFile_(Filename, #GENERIC_READ|#GENERIC_WRITE,#FILE_SHARE_READ|#FILE_SHARE_WRITE, #Null, #OPEN_ALWAYS, #FILE_ATTRIBUTE_NORMAL, #Null)
  If Filehandle
    SetFilePointer_(Filehandle, NewLength, #Null, #FILE_BEGIN )
    SetEndOfFile_(Filehandle)
    CloseHandle_(Filehandle)
  EndIf
EndProcedure 

KB=1024;bytes
MB=1024*KB
GB=1024*MB
L=1 *GB
ResizeFile ("c:\test.NOP",L)
Rings hat geschrieben:ziert sich nich beim zitieren
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi zusammen,

ich hätte da doch noch eine Sache.

Wie schaffe ich es denn beide Informationen:

- Size
- Size on Disk

synchron zu halten.
Also, wenn Size z.B. 5 MB ausgibt, dass auch Size on Disk auch 5 MB
nutzt.

Size: 5,00 MB (5.242.881 bytes)
Size on Disk: 64,0 KB (65.536 bytes)

Das ist mir noch nicht wirklich verständlich.

Danke + Gruß,
Daniel
Exabot
Beiträge: 63
Registriert: 10.12.2004 09:50

Beitrag von Exabot »

Grösse = 5MB
Grösse auf Datenträger = 64KB

Datei mit Leerzeichen, und Datenträgercompression eingeschaltet?

mfg

Spider
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Ist der Umrechnungsfaktor Kilobyte==>Megabyte==>Gigabyte nicht 1000?
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

vonTurnundTaxis hat geschrieben:Ist der Umrechnungsfaktor Kilobyte==>Megabyte==>Gigabyte nicht 1000?
Neee: 1024 !
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Eigentlich schon aber das ist ne total bekloppte reglung... Die Werte
standen schon immer für 1024. Wenn, dann müsste ein Kibi 1000 sein.
Die Regelung der Namen war echt bescheuert. Welcher Idiot hat das
bitte ausgearbeitet?
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

in den anfangszeiten war der faktor ganz einfach 1024.
in jüngerer zeit wurde das insofern geändert,
weil in der physik der faktor 1000 ist,
unabhängig welche grundeinheit dahintersteckt:

1 Kilometer = 1000 Meter
1 Kilogramm = 1000 Gramm
1 Kilopascal = 1000 Pascal
etc.

das wurde halt für Byte auch angepasst, egal wie sinnvol das in der praxis ist.
jemand kam dann wohl auf die idee, KiBi und sowas einzuführen,
um die alten einheiten mit 1024 behalten zu können.
die sind in der praxis sinnvoller, weil damit ganzzahlige adressräume entstehen:
16bit = 64KB
24bit = 16MB
32bit = 4GB
usw..

... ich für meinen teil schei$e auf die physikalische konvention, wenn ich gigabyte sage, meine ich 2^30 byte, und basta.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
manunidi
Beiträge: 109
Registriert: 12.04.2006 22:44

Beitrag von manunidi »

Ihr habt 2 methoden gepostet um dateien mit bestimmtr größe anzulegen!!!

Die mehtode mit byteweise schreiben ist langsamer, da sie ja byte für byte schreibt!!!
Antworten