Eine (jetzt einen Ordner)via Internet zum Empfänger senden?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Beitrag von Blackskyliner »

Du könntest über die Enumerate Funktion des FileSystems dir alle Dateien in dem Ordner auslesen lassen und die dann schicken, und wenn das gefundene ein Ordner ist das wird der gleiche Programmcode nochmal ausgeführt, das wäre dann eine rekursive Funktion, die dann ein verzeichniss und alle unterordner nach Ddateien durchsucht und diese halt zurückgibt =) klingt schwerer als es ist.

Rekursiver -programm bzw. -funktions Aufruf bedeutet nichts weiter, als dass sich die Funktion selber aufruft.

Und um das dann ein bisschen logisch zu verwalten, dieses Verzeichniss listing empfehle ich eine Liste. (Ja sorry aber bei mir hat jedes Programm Listen für alles... xD)

Das sieht das inetwa so aus, so als Snippet einfachmal so hergesetzt:

Code: Alles auswählen

Structure teststruc
	sPath.s
EndStructure

NewList TestListe.teststruc()

Global lol.l, lol2.l


Procedure Rekursiv_Verzeichnis_Listing(DIR$)
	Protected Eintrag.l
	;Hier wird erstmal das über DIR$ übergebene Verzeichniss
	;ausgelesen, damit man dann darauf zugreifen kann.
	DirectoryID = ExamineDirectory(#PB_Any, DIR$, "")
	
	;Wenn dies Erfolgreich war, also wenn z.B. der Ordner exsistiert
	;Dann mach weiter ansonsten ist hier Schluss =)
	If DirectoryID
		;Schleife um auch alles durchzugehn ;)
		Repeat
			Eintrag = NextDirectoryEntry()
			;Wenn Verzeichniss dann Funktion nochmalaufrufen 
			;und danach Wieder mit dem Verzeichniss weiter machen
			If Eintrag = 2
				VerzechnissName$ = DirectoryEntryName()
				If VerzechnissName$ <> "." And VerzechnissName$ <> ".."
					Rekursiv_Verzeichnis_Listing(DIR$+VerzechnissName$+"\")
					UseDirectory(DirectoryID) 
				EndIf
			;Wenns ein File ist dann adde den File in die Directory Liste
			ElseIf Eintrag = 1
				DateiName$ = DirectoryEntryName()
				Endung$ = GetExtensionPart(DIR$+DateiName$)
				AddElement(TestListe())
				TestListe()\sPath = DIR$+"\"+DateiName$
			EndIf
			
		;Wenn das nun nichtsmehr ist beende die Schleife
		Until Eintrag = 0	
	EndIf
EndProcedure
Rekursiv_Verzeichnis_Listing("C:\Dokumente und Einstellungen\Blackskyliner\")


ResetList(TestListe())
ForEach TestListe()
	Debug TestListe()\sPath
Next

EDIT: Bug behoben... es fehlte das "UseDirectory(DirectoryID) "
MFG
Blackskyliner
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
ChrisBa
Beiträge: 50
Registriert: 22.07.2006 12:14

Beitrag von ChrisBa »

danke,leider wird mir aber nicht klar wo ich den Orderweg eintragen soll
pankgraf
Beiträge: 29
Registriert: 10.07.2006 21:36
Wohnort: Berlin
Kontaktdaten:

Beitrag von pankgraf »

@ChrisBa

Versuch es mal hiermit:

Code: Alles auswählen

Enumeration  
  #Window_0 : #Gadget_1 : #Gadget_txt : #Gadget_2 : #Gadget_3 
EndEnumeration

Structure teststruc
  sPath.s
EndStructure

Global NewList TestListe.teststruc()
Text$ = Space(1000)

Procedure Rekursiv_Verzeichnis_Listing(DIR$)
; nach Blackskyliner, bearbeitet von pankgraf
  Protected Eintrag.l
  ;Hier wird erstmal das über DIR$ übergebene Verzeichniss
  ;ausgelesen, damit man dann darauf zugreifen kann.
  DirectoryID = ExamineDirectory(#PB_Any, DIR$, "") 
  ;Wenn dies Erfolgreich war, also wenn z.B. der Ordner exsistiert
  ;Dann mach weiter ansonsten ist hier Schluss =)
  If DirectoryID
    ;Schleife um auch alles durchzugehn ;)
    Repeat
      Eintrag = NextDirectoryEntry(DirectoryID)
      ;Wenn Verzeichniss dann Funktion nochmalaufrufen
      ;und danach Wieder mit dem Verzeichniss weiter machen
      If Eintrag = 2
        VerzechnissName$ = DirectoryEntryName(Eintrag)
        If VerzechnissName$ <> "." And VerzechnissName$ <> ".."
          Rekursiv_Verzeichnis_Listing(DIR$+VerzechnissName$+"\") 
        EndIf
        ;Wenns ein File ist dann adde den File in die Directory Liste
      ElseIf Eintrag = 1 
        DateiName$ = DirectoryEntryName(DirectoryID)
        Endung$ = GetExtensionPart(DIR$+DateiName$)
        AddElement(TestListe())
        TestListe()\sPath = DIR$+DateiName$ 
      EndIf 
      ;Wenn das nun nichtsmehr ist beende die Schleife
    Until Eintrag = 0   
  EndIf
EndProcedure

If OpenWindow(#Window_0, 338, 281, 410, 382, "Ordner-Inhalt anzeigen",#PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered) 
  If CreateGadgetList(WindowID(#Window_0)) 
    EditorGadget(#Gadget_1, 10, 10, 390, 305) 
    TextGadget(#Gadget_txt, 10, 322, 390, 25,"Bitte hier unten den Pfad des Ordners eingeben!")
    StringGadget(#Gadget_2, 10, 347, 305, 25, "") 
    ButtonGadget(#Gadget_3, 325, 347, 77, 25, "Enter") 
    SetActiveGadget(#Gadget_2)
  EndIf 
EndIf 

Repeat 
  Event = WaitWindowEvent()
  Select Event 
    Case #PB_Event_Gadget 
      Select EventGadget() 
        Case #Gadget_3 
          Text$ = GetGadgetText(#Gadget_2) : Text$ = Trim(Text$) 
          Ergebnis$ = Mid(Text$,Len(Text$),1)
          Datei$ = Mid(Text$,2,2) 
          If Text$ = ""
            Text$ = GetCurrentDirectory()
            SetGadgetText(#Gadget_txt, "Der Inhalt des aktuellen Ordners wurde ausgegeben!")
          Else : If Ergebnis$ <> "\" : Text$+"\" : EndIf 
            If Datei$ <> ":\"
              Datei$ = Mid(GetCurrentDirectory(),1,2) + Text$ 
              Text$ = Datei$
            EndIf
            SetGadgetText(#Gadget_txt,"Dieser Pfad wurde gewählt:")
          EndIf
          Rekursiv_Verzeichnis_Listing(Text$) 
          ResetList(TestListe())
          ForEach TestListe() 
            AddGadgetItem(#Gadget_1, -1, TestListe()\sPath )  
          Next 
      EndSelect 
  EndSelect : Delay(15) 
Until Event = #PB_Event_CloseWindow 
End
Vista, openSuse 11.1, Win2k
ChrisBa
Beiträge: 50
Registriert: 22.07.2006 12:14

Beitrag von ChrisBa »

danke aber was ich suche ist,wie man einen Ordner via netzwerk schicken kann.also einen ganzen ordner mit dateien und unterordnern und nicht einzelne Dateien.
ist das möglich???
pankgraf
Beiträge: 29
Registriert: 10.07.2006 21:36
Wohnort: Berlin
Kontaktdaten:

Beitrag von pankgraf »

Ich habe FTP-Programme gelegentlich benutzen müssen, um die Webseiten meines Chefs zu aktualisieren. Als Fachmann auf diesem Gebiet kann ich mich beim besten Willen nicht bezeichnen. Doch denke ich, ein File- bzw. Ordner-Transfer müßte von beiden Partnern mit jedem FTP-Programm zu schaffen sein. Wenn, ja wenn der entsprechende Ordner dafür freigegeben wurde.
Doch falls du böse Dinge planen solltest, deine Fragestellung läßt es fast vermuten, wirst du damit nur sehr schwer einen Erfolg erzielen.
Vista, openSuse 11.1, Win2k
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

ChrisBa hat geschrieben:danke aber was ich suche ist,wie man einen Ordner via netzwerk schicken kann.also einen ganzen ordner mit dateien und unterordnern und nicht einzelne Dateien.
ist das möglich???
Der Ordner ist ein Eintrag im Dateisystem. Diesen Eintrag muß man dann
beim Empfänger auch erstellen, falls nicht vorhanden, und anschließend alle
Dateien dorthin kopieren. Die müssen immer alle einzeln transferiert werden,

Deine Vorstellung eines Ordners mußte mal durchdenken :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ich hab hier ne wacklige wurstlösung zusammen-gelümmelt (bin noch nich sehr mit der netzwerk-materie vertraut)
client schickt ordner zu server!
-> server starten - server wartet
-> client starten
-> server will zielordner wissen, dann
-> client meldet sich als verbunden - und will zu verschickenden ordner wissen
...übertragung...programme beenden sich
-keine fenster nur requester
leere (unter-)ordner/pfade werden leider nicht kopiert, sondern nur welche, in denen sich in irgendeiner tiefe ne datei befindet.
über loopback gings ganz gut. zu einem LAN computer nich ganz so (unser LAN hier ist aber prinzipiel nicht ganz zuverlässig). weiter draussen kann ichs nicht testen.
naja...

server

Code: Alles auswählen

;SERVER_folder_receive.pb

Declare ensurePath(path.s)

If InitNetwork()=0 : :MessageRequester("error","Server - initnetwork failed"):End : EndIf
Port = 6832
Buffer = AllocateMemory(1000)
If Buffer=0 ::: MessageRequester("error","Client - malloc failed"):End ::: EndIf
If CreateNetworkServer(0, Port)=0 : :MessageRequester("error","creating server failed"):End : EndIf


Repeat
  SEvent=NetworkServerEvent()
  If SEvent
    ClientID=EventClient()
    Select SEvent
    
      Case 1
        destinationPath$=PathRequester("Server - choose destination folder", "C:\Dokumente und Einstellungen\mo\Desktop\dest")
        If destinationPath$
          PokeS(Buffer,":OK:")
          SendNetworkData(ClientID, Buffer,10)
        Else
          MessageRequester("error","Server - invalid path")
          PokeS(Buffer,":ERROR:")
          SendNetworkData(ClientID, Buffer, 10)
          End
        EndIf
        
      Case 2
        ReceiveNetworkData(ClientID, Buffer, 4) : len.l=PeekL(Buffer)
        ReceiveNetworkData(ClientID, Buffer, len )
        file$=PeekS(Buffer,len)
        
      Case 3
        If ensurePath(destinationPath$+GetPathPart(file$))
          ReceiveNetworkFile(ClientID, destinationPath$+file$)
        Else
          Debug "ensurePath failed: "+destinationPath$+" "+file$
        EndIf
       
      Case 4
        Quit = 1
    EndSelect
  EndIf
  Delay(1)
Until Quit = 1 
CloseNetworkServer(0)
RunProgram("explorer.exe", destinationPath$,destinationPath$)
End




Procedure ensurePath(path.s)
  Protected i
  If path
  Else
    ProcedureReturn  0
  EndIf
  
  If FindString(path,"\",Len(path))=0
    path+"\"
  EndIf    
  
  i=FindString(path, "\", i+1)
  While i
    If ExamineDirectory(1, Left(path,i), "*.*")=0
      If CreateDirectory( Left(path,i) )=0
        ProcedureReturn  0
      EndIf
    Else
      FinishDirectory(1)
    EndIf
    i=FindString(path, "\", i+1)
  Wend
  ProcedureReturn 1
EndProcedure



client

Code: Alles auswählen

;CLIENT_folder_send.pb

Declare getFileList(dirName.s, files.s() )
Declare waitOK()

NewList files.s()

If InitNetwork()=0 ::: MessageRequester("error","Client - initnetwork failed"):End ::: EndIf
Port = 6832
Buffer = AllocateMemory(1000)
If Buffer=0 ::: MessageRequester("error","Client - malloc failed"):End ::: EndIf
ConnectionID=OpenNetworkConnection("127.0.0.1", Port)
;ConnectionID=OpenNetworkConnection("192.168.1.33", Port)
;ConnectionID=OpenNetworkConnection("192.168.1.37", Port)

If ConnectionID
  waitOK()
  MessageRequester("Client", "Client connected to server...", 0)
  path.s=PathRequester("Client - choose folder to send", "E:\")
  If path
  Else
    MessageRequester("error","Client - invalid path")
    CloseNetworkConnection(ConnectionID)
    End
  EndIf
  getFileList(path, files() )
  
  iFolder=Len(path)-1
  While Mid(path, iFolder, 1) <> "\" ::: iFolder-1::: Wend
  iFolder+1

  ForEach files()
    relativePath$=Mid(files(), iFolder, Len(files()) )
    len.l=Len(relativePath$)
    SendNetworkData(ConnectionID, @len, 4 )
    SendNetworkData(ConnectionID, @relativePath$, len )
    SendNetworkFile(ConnectionID, files())
  Next
  CloseNetworkConnection(ConnectionID)
Else
  MessageRequester("Client", "NOT connected to server - exit program...", 0)
EndIf
End



Procedure waitOK()
  Shared ConnectionID
  Shared Buffer
  Repeat
    CEvent=NetworkClientEvent(ConnectionID)
    Delay(1)
  Until CEvent=2
  ReceiveNetworkData(ConnectionID, Buffer, 10)
  If PeekS(Buffer,10)=":OK:"
    ;
  Else
    MessageRequester("error","Client - transfer failed")
    CloseNetworkConnection(ConnectionID)
    End
  EndIf
EndProcedure




Procedure getFileList(dirName.s, files.s() )
  If dirName
    If FindString(dirName, "\", Len(dirName) )=0 :: dirName+"\" :: EndIf
    dir=ExamineDirectory(#PB_Any, dirName, "*.*")
    If dir
      While NextDirectoryEntry(dir)
        name$=DirectoryEntryName(dir)
        Select DirectoryEntryType(dir)
          Case 2
            If name$<>"." And name$<>".."
              getFileList( dirName+name$, files() )
            EndIf
          Case 1
            AddElement( files() )
            files()=dirName+name$
        EndSelect
      Wend
      FinishDirectory(dir)
    EndIf
  EndIf
EndProcedure
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten