| |
Visual-Basic EinsteigerFunction für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 24.08.16 13:24 |
| Hallo, ich muß ein altes Projekt in FoxPro 6.0 anpassen.
Leider gibt es in VFP6 keine Möglichkeit einen Dateinamen mit Groß- und Kleinschreibung
abzufragen.
Gibt es eine API ich ich dafür nutzen kann?
Kann ich aus VFP6 heraus eine Function in VB dafür nutzen?
Ich Danke euch.
Gruß | |
Re: Function für FoxPro in VB | | | Autor: Blackbox | Datum: 24.08.16 15:12 |
| Hallo,
was meinst Du mit abfragen?
Natürlich kannst Du in FoxPro die Win32API mit: Declare Integer Foo In x.DLL As Alias
aufrufen. Alternativ kannst Du in VB6 eine ActiveX Dll bauen und die in das FoxPro
Projekt einbinden. Aber die Möglichkeit über Win32Api ist natürlich besser. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 24.08.16 15:44 |
| Danke für die schnelle Antwort.
Ich habe keine passende Funktion in der API-Referenz gefunden.
Welche soll ich nehmen.
Gruß | |
Re: Function für FoxPro in VB | | | Autor: Blackbox | Datum: 24.08.16 17:17 |
| Hallo Helmut,
deshalb meine erste Frage: Was willst Du mit der Datei machen? | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 24.08.16 17:43 |
| Ich möchte nur den Dateinamen in eine Variable speichern um
diesen bearbeiten zu können.
Wichtig ist dabei die Klein- Großschreibung.
Den Dateinamen wieder zu speichern habe ich hinbekommen.
a = fcreate("C:bBb.TxT")
= fclose(a)
copy file "alter Name" to "C:bBb.TxT"
delete file "alter Name"
Das funktioniert, aber keine Ahnung warum.
Gruß | |
Re: Function für FoxPro in VB | | | Autor: Blackbox | Datum: 24.08.16 18:52 |
| Hallo Helmut,
wenn man das Problem näher kennt, ist die Hilfe ein einfaches googeln. GetShortPathName ist die API zur Anpassung. Hier ist ein Snippet aus dem Internet für FoxPro:
************************************************************************
FUNCTION ShortPath
******************
*** Function: Converts a Long Windows filename into a short
*** 8.3 compliant path/filename
*** Pass: lcPath - Path to check
*** Return: lcShortFileName
*************************************************************************
LPARAMETER tcPath
DECLARE INTEGER GetShortPathName IN Win32API;
STRING @lpszLongPath, STRING @lpszShortPath,;
INTEGER cchBuffer
lcPath = tcPath
lcshortname = SPACE(260)
lnlength = LEN(lcshortname)
lnresult = GetShortPathName(@lcPath, @lcshortname, lnlength)
IF lnResult = 0
RETURN ""
ENDIF
RETURN LEFT(lcShortName,lnResult) | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 24.08.16 20:55 |
| Hallo Helmut FoxPro,
vielleicht liegt es am heutigen Wetter (bei uns 30 °C im Schatten), aber leider "verstehe" ich überhaupt nicht Deine Frage!
1) Möchstest Du die gewünschte Funktionalität in Visual Foxpro 6.0 oder in Visual Basic 6.0 realisieren ???
2) Was meinst Du genau mit: "Leider gibt es in VFP6 keine Möglichkeit einen Dateinamen mit Groß- und Kleinschreibung abzufragen." ???
3) Die Runtime von Visual Foxpro 6.0 ist Vfp6r.dll. Diese DLL exportiert keine außerhalb von Visual Foxpro benutzbaren Funktionen!
Gruß, Stefan | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 25.08.16 12:28 |
| Hallo BlackBox.
Habe nun GetShortPathName und GetFullPathName getestet.
Der Name wird wie LPARAMETER zuzückgegeben.
Ich kann also nicht die tatsächliche Klein Großschreibung ermitteln.
tatsächlicher Dateinname = "C:aBB.tXt"
tcPath = "C:abB.txt"
lcShortName = "C:abB.txt"
Hallo Stefan.
Ich suche eine Möglichkeit die exakte Schreibweise von Dateinamen zu ermitteln.
Wichtig dabei insbesondere die Klein- Großschreibung.
VFP6 stellt keine mir bekannte Möglichkeit zur Verfügung.
Gruß HELMUT
Beitrag wurde zuletzt am 25.08.16 um 12:35:19 editiert. | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 25.08.16 12:43 |
| Hallo Helmut,
- zunächst nochmal meine Frage: möchtest Du diese Ermittlung in VFP6 oder in VB6 programmieren ???
Gruß, Stefan | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 25.08.16 12:44 |
| VFP6 | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 25.08.16 13:27 |
| Hallo,
eigentlich ist dies ja ein VB6-Forum und ich hoffe, daß man deshalb diesen Thread wegen einer Frage zu VFP6 trotzdem nicht gleich schließt
OK, mit VFP6 kenne ich mich eigentlich sehr gut aus!
Leider nehmen die Befehle und Funktionen von VFP6 keine große Rücksicht auf die Groß-/Kleinschreibung von Dateinamen. Diesen "Wildwuchs" haben wir leider Microsoft zu verdanken!
Beispiel:
- ADIR( ... ) - liefert in einem Array alle Dateinamen immer komplett in Großbuchstaben!
- FCREATE( ... ) - erzeugt eine neue Datei, die Groß-/Kleinschreibung wird exakt übernommen!
- COPY FILE fileName1 TO fileName2 - falls fileName2 noch nicht existiert wird sie angelegt und zwar immer komplett klein geschrieben! falls fileName2 existiert wird sie überschrieben, aber die Groß-/Kleinschreibung von fileName2 wird beibehalten!
- RENAME fileName1 TO fileName2 - benennt eine Datei um, fileName2 wird aber immer komplett klein geschrieben!
Daher auch Dein Beispiel-Code:
a = fcreate("C:bBb.TxT")
= fclose(a)
copy file "alter Name" to "C:bBb.TxT"
delete file "alter Name" - FCREATE erzeugt die Datei mit der gewünschten Groß-/Kleinschreibung
- FCLOSE schließt die Datei
- COPY FILE ... kopiert die alte Datei über die neue Datei
- DELETE FILE ... löscht die alte Datei
Was man eigentlich für Dein Code-Beispiel nur bräuchte, wäre eine FRENAME()-Funktion, die beim neuen Dateinamen die exakte Groß-/Kleinschreibung übernimmt. Die gibt es aber leider nicht!
Wenn Du also eine Datei umbenennen willst und beim neuen Dateinamen die Groß-/Kleischreibung vorgeben willst, mußt Du die Win32-API bemühen.
MoveFile, siehe hier: https://msdn.microsoft.com/de-de/library/windows/desktop/aa365239%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
Leider wieder ein bißchen typisch Microsoft, es gibt keine RenameFile-Funktion, sondern nur die MoveFile-Funktion!
Deklaration in VFP6:
DECLARE INTEGER MoveFile IN WIN32API;
STRING oldFileName,;
STRING newFileName
ret = MoveFile( "alter Name", "C:bBb.TxT" ) falls ret = 0 Fehler , falls ret != 0 alles OK
Falls das noch nicht die Lösung für Dein Problem sein sollte, poste bitte einfach die nächste Frage.
Gruß, Stefan
Beitrag wurde zuletzt am 25.08.16 um 13:48:38 editiert. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 25.08.16 16:34 |
| Super Stefan - Vielen Dank für deine Ausführung !!!
Das speichern habe ich hinbekommen.
Aber wie komme ich an den alten Dateinamen ran incl. Groß Kleinschreibung?
Ich muß den alten Dateinamen modifizieren. Dazu muß ich erst den alten Namen
in eine Variable speichern. Geht das vielleicht mit FindFirstFile ?
Ich habe gelesen, daß VFP7 wohl dieses Problem gelöst hat. Aber woher
bekomme ich diese Version von FoxPro?
Gruß HELMUT | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 25.08.16 17:18 |
| Hallo Helmut,
da Microsoft schon seit vielen Jahren auf der .NET-Schiene fährt, ist die gesamte Visual Foxpro-Linie - genauso wie auch Visual Basic 6.0 - dem Rotstift zum Opfer gefallen.
Von VFP7 als auch VFP8 würde ich komplett abraten, da diese Versionen unter allen Windows-Versionen ab Windows Vista bis Windows 10 mehrere zum Teil erhebliche Probleme bereiten !!!
Erst bei VFP9 mit Service Pack 2 (SP2) und allen Hotfixes hat Microsoft diese Probleme gelöst (das ist auch die neuste Version, eine neuere gibt es nicht) !!!
- und oh Wunder: VFP6 mit SP5 hatte noch nie rgendwelche Probleme mit irgendeiner Windows-Version: alle Versionen von Windows 95 bis Windows 10, 32 Bit oder 64 Bit !!!
- das kann ich definitiv aus eigener Erfahrung bestätigen, siehe hier: http://www.memotech.de/ProgressTaskbar/ProgressTaskbar.jpg
Von einem Update von VFP6 auf VFP9 würde ich aber bei einem bestehenden Projekt dringend abraten.
Deshalb nochmal eine Frage:
- möchtest Du z. B. alle Dateien eines Ordners ermitteln und die Dateinamen korrekt mit Groß-/Kleinschreibung auf dem Bildschirm für den Anwender anzeigen?
- wenn Du nämlich den alten Dateinamen / die alten Dateinamen nur ermitteln mußt, um sie dann sofort in neue Namen mit einer bestimmten Groß-/Kleinschreibung umzubenennen, wäre die VFP-Funktion ADIR( ... ) genau das richtige dafür
Gruß, Stefan | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 25.08.16 17:27 |
| Hallo Stefan.
ADIR() wäre genau das richtige - Aber leider unterscheidet ADIR() nicht die Klein Großschreibung.
Ich brauche die Dateinamen aber incl. Klein Großschreibung.
Gruß HELMUT | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 25.08.16 18:22 |
| Hallo Helmut,
das ist genau das Dilemma mit ADIR() und allen weiteren VFP-Datei-Funktionen.
Ich habe gerade mal die beiden Win32-Api-Funktionen GetFullPathName und GetShortPathName getestet: die machen irgendwie auch das, was sie gerade wollen - also für Deine Anforderung auch nicht zu gebrauchen !!!
Bleibt vielleicht nur noch FindFirstFile / FindNextFile / FindClose. Die sind aber wegen einer ziemlich komplizierten Übergabe-Struktur kein Freund von VFP6.
Ich werde aber noch ein bißchen forschen . . .
Gruß, Stefan | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 25.08.16 19:28 |
| Stefan - Du bist der Beste ! | |
FindFirstFile + FindNextFile + FindClose | | | Autor: visualfx | Datum: 25.08.16 19:53 |
| Hallo Helmut,
wie wir es schon vermutet hatten: mit FindFirstFile + FindNextFile + FindClose funktioniert es!
LOCAL fileName
LOCAL findFileData
LOCAL handle
LOCAL foundFileName
LOCAL ret
DECLARE INTEGER FindFirstFile IN WIN32API;
STRING fileName,;
STRING @findFileData
DECLARE INTEGER FindNextFile IN WIN32API;
INTEGER handle,;
STRING @findFileData
DECLARE INTEGER FindClose IN WIN32API;
INTEGER handle
fileName = "d:\*.txt" && oder beliebiger Pfad + Dateiname mit/ohne Platzhalter
findFileData = SPACE( 318 )
handle = FindFirstFile( fileName, @findFileData )
IF handle != -1 && ERSTE Datei gefunden !!!
foundFileName = ALLTRIM( SUBSTR( findFileData, 45, 260 ) )
MESSAGEBOX( foundFileName )
DO WHILE .T.
findFileData = SPACE( 318 )
ret = FindNextFile( handle, @findFileData )
IF ret = 0 && KEINE weitere Datei gefunden !!!
EXIT
ENDIF
foundFileName = ALLTRIM( SUBSTR( findFileData, 45, 260 ) )
MESSAGEBOX( foundFileName )
ENDDO
FindClose( handle )
ENDIF Den Code oben kannst Du einfach komplett in den VFP-Programm kopieren, er ist getestet
Noch zur Erklärung der drei Zahlen 318 und 45 und 260:
- die gesamte Struktur findFileData ist 318 Byte groß und der gefundene Dateiname foundFileName beginnt in der Struktur an Stelle 45 und ist maximal 260 Zeichen lang
Gruß, Stefan
Beitrag wurde zuletzt am 25.08.16 um 20:08:42 editiert. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 26.08.16 11:42 |
| Hallo Stefan.
Es funktioniert !!! Super und VIELEN DANK für deine Hilfe.
In der Struktur WIN32_FIND_DATA stecken ja noch weitere Informatioen.
Wie komme an die ran? So könnte ich mir ein vorhergehendes ADIR() sparen.
Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Gruß HELMUT | |
weitere Datei-Information | | | Autor: visualfx | Datum: 26.08.16 16:36 |
| Hallo Helmut,
leider kennt VFP6 (noch) keine Strukturen. Die wurden erst in einer späteren Version von VFP eingeführt. Ich glaube da ist VB6 wesentlich besser !!!
Ich schlage deshalb folgendes vor (weil ansonsten der Aufwand in keinem Verhältniss mehr zum Nutzen steht):
LOCAL pathName
LOCAL fileName
LOCAL fileAttr
LOCAL findFileData
LOCAL handle
LOCAL foundFileName
LOCAL foundShortFileName
LOCAL foundFileSize
LOCAL foundFileDate
LOCAL foundFileTime
LOCAL foundFileAttr
LOCAL arrayName[1]
LOCAL ret
DECLARE INTEGER FindFirstFile IN WIN32API;
STRING fileName,;
STRING @findFileData
DECLARE INTEGER FindNextFile IN WIN32API;
INTEGER handle,;
STRING @findFileData
DECLARE INTEGER FindClose IN WIN32API;
INTEGER handle
pathName = "d:\"
fileName = "*.txt"
fileAttr = "HS"
findFileData = SPACE( 318 )
handle = FindFirstFile( pathName + fileName, @findFileData )
IF handle != -1 && ERSTE Datei gefunden !!!
foundFileName = ALLTRIM( SUBSTR( findFileData, 45, 260 ) )
foundShortFileName = ALLTRIM( SUBSTR( findFileData, 305, 14 ) )
ret = ADIR( arrayName, pathName + foundFileName, fileAttr )
foundFileSize = IIF( ret > 0, arrayName[1, 2], 0 )
foundFileDate = IIF( ret > 0, arrayName[1, 3], {..} )
foundFileTime = IIF( ret > 0, arrayName[1, 4], "" )
foundFileAttr = IIF( ret > 0, arrayName[1, 5], "" )
MESSAGEBOX( foundFileName )
DO WHILE .T.
findFileData = SPACE( 318 )
ret = FindNextFile( handle, @findFileData )
IF ret = 0 && KEINE weitere Datei gefunden !!!
EXIT
ENDIF
foundFileName = ALLTRIM( SUBSTR( findFileData, 45, 260 ) )
foundShortFileName = ALLTRIM( SUBSTR( findFileData, 305, 14 ) )
ret = ADIR( arrayName, pathName + foundFileName, fileAttr )
foundFileSize = IIF( ret > 0, arrayName[1, 2], 0 )
foundFileDate = IIF( ret > 0, arrayName[1, 3], {..} )
foundFileTime = IIF( ret > 0, arrayName[1, 4], "" )
foundFileAttr = IIF( ret > 0, arrayName[1, 5], "" )
MESSAGEBOX( foundFileName )
ENDDO
FindClose( handle )
ENDIF Gruß, Stefan
Beitrag wurde zuletzt am 26.08.16 um 16:56:01 editiert. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 30.08.16 10:59 |
| Hallo Stefan.
Ich hatte ein ausregendes Wochenende und melde mich deshalb erst jetzt.
Ja, eine zweite Abfrage über ADIR() geht natürlich. Sollte man aber größere
Datenbestände durchforsten wäre das eine zeitraubende Lösung.
Gibt es keine Möglichkeit die Info aus FindFileData zu verwenden?
Die Struktur ist ja bekannt.
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; 0:4
FILETIME ftCreationTime; 4:8
FILETIME ftLastAccessTime; 12:8
FILETIME ftLastWriteTime; 20:8
DWORD nFileSizeHigh; 28:4
DWORD nFileSizeLow; 32:4
DWORD dwReserved0; 36:4
DWORD dwReserved1; 40:4
TCHAR cFileName[ MAX_PATH ]; 44:260
TCHAR cAlternateFileName[ 14 ]; 304:14
} WIN32_FIND_DATA, *PWIN32_FIND_DATA; total bytes = 318
Gruß HELMUT | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 30.08.16 11:56 |
| Hallo Helmut,
1) Wie schon gesagt, wenn VFP6 Strukturen könnte . . .
Allein FILETIME ist schon wieder eine Struktur
(siehe hier: https://msdn.microsoft.com/de-de/library/windows/desktop/ms724284(v=vs.85).aspx)
welche man dann noch mit der Funktion FileTimeToSystemTime
(siehe hier: https://msdn.microsoft.com/de-de/library/windows/desktop/ms724280(v=vs.85).aspx)
in SYSTEMTIME wandeln muß.
SYSTEMTIME ist dann schon wieder eine Struktur
(siehe hier: https://msdn.microsoft.com/de-de/library/windows/desktop/ms724950(v=vs.85).aspx)
So was ähnliches gillt auch für die Dateigröße, die ist nämlich in nFileSizeHigh und nFileSizeLow aufgeteilt und muß dann aus diesen beiden Werten wieder zusammengestzt werden . . .
2) Außerdem gilt: bei allen Datentypen die nicht vom Typ STRING sind, kann man die Werte nicht einfach nur mit einem SUBSTR() aus der Struktur herausholen. Sondern man muß danach noch die Byte-Reihenfolge umdrehen (Intel-Notation) und dann byteweise nach Ascii wandeln.
Wenn Du Dir das wirklich antun willst . . . (ich rate ab)
3) Aber: Sinngemäß zur Funktion ADIR() kannst Du aber auch noch die Funktion AGETFILEVERSION() aufrufen, die liefert noch viele weitere Datei-Informationen.
Wegen der Geschwindigkeit brauchst Du Dir wegen ADIR() und AGETFILEVERSION() keine Gedanken zu machen, das geht Ruck-Zuck
4) Noch ein Tip: speziell für Visual Foxpro gibt es z. B. folgende Foren:
- Microsoft-Forum, deutsch: https://social.msdn.microsoft.com/Forums/de-DE/home?forum=foxprode
- Microsoft-Forum, englisch: https://social.msdn.microsoft.com/Forums/en-US/home?forum=visualfoxprogeneral
- Tek-Tips-Forum, englisch: http://www.tek-tips.com/threadminder.cfm?pid=184
Gruß, Stefan | |
noch ein kleiner Nachtrag | | | Autor: visualfx | Datum: 30.08.16 12:11 |
| - das ist ja im Grunde auch der Sinn einer RAD (Rapid Development) -IDE vie VFP oder VB6, daß man sich um solche Sachen wie native Windows-Funktion und die zugehörigen (C-, C++-) Strukturen nicht kümmern muß und auch nicht kümmern will !
- ansonsten ist es nämlich ab einem gewissen Punkt besser und sinnvoller, nicht mehr mit VFP oder VB6 zu entwickeln, sondern mit C++ oder C# !
- allerdings kann ich definitiv aus eigener Erfahrung sagen, daß man z. B. mit VFP um den Faktor 5 bis 10 schneller entwickelt wie z. B. mit C++
- VFP ist hierbei wahrscheinlich sogar etwas besser wie VB6, da VFP eine netzwerkfähige, multiuserfähige, relationale SQL-Datenbank enthällt die man OHNE DAO, ADO, OLEDB, etc. benutzen und nahtlos integrieren kann.
Gruß, Stefan
Beitrag wurde zuletzt am 30.08.16 um 12:35:57 editiert. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 30.08.16 15:16 |
| Hallo Stefan,
welche Sprache würdest du empfehlen für einen VFP Liebhaber der vielleicht auch mal
für Android was schreiben will?
Gruß HELMUT | |
App-Entwicklung - welche IDE ??? | | | Autor: visualfx | Datum: 30.08.16 16:03 |
| Hallo Helmut,
das ist eine sehr gute Frage !!!
Da bin ich selbst seit Jahren auf der Suche. Es gab mal das MobiOne Studio (http://www.genuitec.com/mobile/)
Da habe ich mir im Mai 2013 die Trial-Version heruntergeladen: Absolut genial !!!
- komfortable IDE wie bei bei VFP bzw. VFP6
- Erstellen der Bedienoberfläche mit Drag-n-Drop wie bei VFP bzw. VFP6
- Properties, Methoden und Events wie bei VFP bzw. VFP6
- Verknüpfen der Datenquellen wie bei VFP bzw. VFP6 (VFP: ControlSource, RecordSource)
- erzeugt WEB-Apps für alle (!!!) Geräte per HTML5 + CSS
- d. h. Apps für Android + iOS (iPhone, iPad) + Windows Phone
- Simulation von z. B. einem Smartphone auf dem PC, um die eigene App sofort testen zu können
- man muß trotzkem KEIN HTML5 + CSS programmieren
- Preis der Vollversion: 99,- $
Als ich ein paar Wochen später bestellen wollte, hieß es auf der Seite, daß das MobiOne Studio eingestellt ist und nicht mehr verkauft wird, hä wie bitte ???
Das Nachfolgeprodukt ist wohl myEclipse, du kannst den Link oben ruhig mal anklicken.
Ich habe mir seither sehr viele IDEs zur App-Entwicklung angesehen, auch die kostenlose von google (mit der man zunächst mal natürlich nur Android-Apps entwickeln kann)
- aber alle haben einen ganz großen Nachteil: total überladen, sehr lange, steile Lernkurve - und sie müllen einem mit HTML5-Code und mit CSS-Code den Bildschrim voll. Das interessiert mich aber NICHT !!! und das will ich auch NICHT sehen !!!
- bei der konventionellen Windows-Entwicklung z. B mit VFP oder VB6, etc. bekomme ich ja auch nicht den Bilschirm mit internem C- oder C++- oder Assembler-Code zugemüllt.
Daher kann ich Dir momentan keine gescheite Antwort geben, vielleicht ist ja die google-Suche schlauer - oder andere Forums-Mitglieder
- also: wer Vorschläge hat - immer her damit !!!
Gruß, Stefan
Beitrag wurde zuletzt am 30.08.16 um 16:07:41 editiert. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 30.08.16 16:22 |
| Ja Stefan - ich bin ganz bei dir !!!
Ich hatte schon gedacht alleine mit dieser Meinung zu sein.
Nochmal zurück zu deinem Code.
Mit der zweiten Abfrage per ADIR() kann ich mich abfinden.
Aber wie unterscheide ich bei @findFileData zwischen Ordner + Datei? | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 30.08.16 16:30 |
| Hallo Helmut,
das was findFileData zurückliefert ist immer nur der reine Dateiname ohne Pfad !!!
Gruß, Stefan | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 30.08.16 17:24 |
| Hallo Stefan.
findFileData liefert Ordner- und Dateinamen ohne Pfad.
Aber wie kann ich diese Unterscheiden? | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 30.08.16 18:26 |
| Hallo Helmut,
OK, da habe ich Dich falsch verstanden!
Das kannst Du durch die nachfolgende Funktion ADIR() herausfinden.
In diesem Fall mußt Du fileAttr = "DHS" setzen (also mit D !)
LOCAL pathName
LOCAL fileName
LOCAL fileAttr
LOCAL findFileData
LOCAL handle
LOCAL foundFileName
LOCAL foundShortFileName
LOCAL foundFileSize
LOCAL foundFileDate
LOCAL foundFileTime
LOCAL foundFileAttr
LOCAL foundType
LOCAL arrayName[1]
LOCAL ret
DECLARE INTEGER FindFirstFile IN WIN32API;
STRING fileName,;
STRING @findFileData
DECLARE INTEGER FindNextFile IN WIN32API;
INTEGER handle,;
STRING @findFileData
DECLARE INTEGER FindClose IN WIN32API;
INTEGER handle
pathName = "d:\"
fileName = "*.txt"
fileAttr = "DHS"
findFileData = SPACE( 318 )
handle = FindFirstFile( pathName + fileName, @findFileData )
IF handle != -1 && ERSTE Datei gefunden !!!
foundFileName = ALLTRIM( SUBSTR( findFileData, 45, 260 ) )
foundShortFileName = ALLTRIM( SUBSTR( findFileData, 305, 14 ) )
ret = ADIR( arrayName, pathName + foundFileName, fileAttr )
foundFileSize = IIF( ret > 0, arrayName[1, 2], 0 )
foundFileDate = IIF( ret > 0, arrayName[1, 3], {..} )
foundFileTime = IIF( ret > 0, arrayName[1, 4], "" )
foundFileAttr = IIF( ret > 0, arrayName[1, 5], "" )
foundType = IIF( ATC( "D", foundFileAttr ) != 0, "Ordner", "Datei" )
MESSAGEBOX( foundType + ": " + foundFileName )
DO WHILE .T.
findFileData = SPACE( 318 )
ret = FindNextFile( handle, @findFileData )
IF ret = 0 && KEINE weitere Datei gefunden !!!
EXIT
ENDIF
foundFileName = ALLTRIM( SUBSTR( findFileData, 45, 260 ) )
foundShortFileName = ALLTRIM( SUBSTR( findFileData, 305, 14 ) )
ret = ADIR( arrayName, pathName + foundFileName, fileAttr )
foundFileSize = IIF( ret > 0, arrayName[1, 2], 0 )
foundFileDate = IIF( ret > 0, arrayName[1, 3], {..} )
foundFileTime = IIF( ret > 0, arrayName[1, 4], "" )
foundFileAttr = IIF( ret > 0, arrayName[1, 5], "" )
foundType = IIF( ATC( "D", foundFileAttr ) != 0, "Ordner", _
"Datei" )
MESSAGEBOX( foundType + ": " + foundFileName )
ENDDO
FindClose( handle )
ENDIF Wenn dann ATC( "D", foundFileAttr ) != 0 liefert, handelt es sich um einen Ordner, ansonsten um eine Datei !
Gruß, Stefan | |
So als Vorschlag: | | | Autor: Blackbox | Datum: 30.08.16 18:44 |
| Hallo,
nachdem die Diskussion ja festgestellt hat, dass die WinAPI nicht so wirklich das Gelbe vom Ei für FoxPro ist, wie wäre es damit:
fso = CreateObject("Scripting.FileSystemObject")
FoxPro ist in alle Fälle objektorierentiert. Warum nicht das FileSystemobject benutzen?
Mit dem FSO kommt man an alle Informationen. | |
Re: So als Vorschlag: | | | Autor: visualfx | Datum: 30.08.16 19:06 |
| Hallo Blackbox,
das ist wirklich ein sehr guter Vorschlag !
Das FileSystemObject ist ja sehr mächtig und umfangreich, woraus aber auch folgt:
- eine Realisierung mittels FileSystemObject ist eine kleinere / größere / neue Baustelle !!!
Gruß, Stefan | |
Es ist umfangreich | | | Autor: Blackbox | Datum: 30.08.16 19:19 |
| aber für FoxPro besser dokumentiert als die Win32API. | |
Hilfedatei ??? | | | Autor: visualfx | Datum: 30.08.16 19:56 |
| Hallo Blackbox,
als Beschreibung zu den ganzen Scripting-Objekten habe ich nur folgende Datei: Script56.chm
Was mir fehlt ist die zugehörige chi-Datei, also z. B.: Script56.chi. Oder gibt es die garnicht ?
Wenn ich diese chm-Datei öffne und dann darin herumklicke, wird immer der folgende Fehler angezeigt:
- siehe: http://www.memotech.de/skriptfehler.jpg
Bei allen anderen chm-Dateien tritt dieser Effekt nicht auf !!!
Oder gibt es generell eine bessere / neuere Beschreibung als Script56.chm ???
Gruß, Stefan | |
Re: Warum? einfach Googlen | | | Autor: visualfx | Datum: 30.08.16 21:34 |
| - die MSDN im Internet kenne ich natürlich!
- ich persönlich finde nur eine CHM-Datei angenehmer, wenn sie denn ohne Fehlermeldungen funktionieren würde . . .
trotzdem danke, Stefan | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 31.08.16 11:46 |
| Hallo.
Ja damit komme ich auch weiter. SUPER und Vielen Dank !
Gruß HELMUT
Beitrag wurde zuletzt am 31.08.16 um 11:46:49 editiert. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 31.08.16 13:13 |
| Hallo Stefan,
eine Auflistung der FILES bekomme ich hin:
fso = CREATEOBJECT("Scripting.FileSystemObject")
a1 = fso.GetFolder("C:")
a2 = a1.FILES
FOR EACH f1 IN a2
MESSAGEBOX(f1.NAME)
ENDFOR
Aber eine Auflistung der Ordner nicht.
Gruß HELMUT | |
Re: Function für FoxPro in VB | | | Autor: Blackbox | Datum: 31.08.16 13:16 |
| Hallo Helmut
das ist die SubFolders eigenschaft die Du im FSO durchlaufen kannst. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 31.08.16 13:48 |
| SUPER DANK !!!
Ich hatte es mit FOLDERS versucht.
Wie finde ich solche Informationen in der MSDN?
Unter FileSystemObject habe ich nur FILES und FOLDERS gefunden,
nicht aber SUBFOLDERS.
Gruß HELMUT | |
Re: Function für FoxPro in VB | | | Autor: Blackbox | Datum: 31.08.16 20:02 |
| Hallo Helmut,
nur googlen: FileSystemObject MSDN
als allererste Zeile kommst Du direkt in die Beschreibung dieses Objekts mit allen Events, Methoden und Eigenschaften direkt von Microsoft (leider in englisch).
Hättest Du im Anfang dein Problem präziser gefasst, wäre dieser Thread längst erledigt. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 01.09.16 16:05 |
| Hallo. Sorry dafür !
Ich hab Fso ein wenig getestet und habe mal eine ganz Festplatte
durchlaufen lassen mit 13.500 Ordnern. Das hat ca. 5 Minuten gedauert.
ADIR() braucht 20 Sekunden.
Mache ich was falsch?
DO WHILE .T.
v_i = v_i+1
v_Ord = THISFORM.O_Tree.nodes.ITEM(v_i).FULLPATH
v_Key = THISFORM.O_Tree.nodes.ITEM(v_i).KEY
v_1 = fso.GetFolder(v_Ord)
v_2 = v_1.SubFolders
i = THISFORM.O_Tree.nodes.COUNT
FOR EACH f1 IN v_2
i = i+1
THISFORM.O_Tree.nodes.ADD(v_Key,4,"B"+STR(i,5),f1.NAME,1,2)
ENDFOR
ENDDO
Gruß HELMUT | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 01.09.16 17:31 |
| Ergänzung:
Die ersten 1.000 Ordner brauchen 6 Sec.
Über 5.000 werden schon 60 Sec gebraucht.
Gruß HELMUT | |
Re: Function für FoxPro in VB | | | Autor: Blackbox | Datum: 01.09.16 20:02 |
| Hallo Helmut,
eigentlich liest man nur die Ordner und Dateien aus, die man gerade eben zur Darstellung der Treeview braucht. Dynamische Erweiterungen der TreeView zur Laufzeit.
Beispiel:
Die TreeView zeigt zu Beginn C:\\ an als Rootfolder oder auch evtl. andere Laufwerke als je Rootnode. Ein Plus in diesem Zweig zeigt an: Wenn man darauf klickt klappt ein weiterer zweig auf, der die Subfolders zeigt. Diese Subfolders werden aber erst dann zur Laufzeit hinzugefügt, wennn der Benutzer die TreeView in dieser Node aktiviert. Vorher wird über Count festgestellt, ob der momentan ausgewählte Ordner überhaupt Subordner enthält. Wenn > 1 werden die nächsten Subfolder dieser Subfolder dynamisch nachgeladen und angezeigt, ggf. auch schon einzelne Dateien des Ordners.
Das heißt: Die Treeview wird zur Laufzeit mit Hilfe des FSO gefüllt und nicht: Erst alles herausgeholt und sofort in der Treeview angezeigt - nein: Das dauert zu lange.
Ich glaube nicht daran, dass FSO für die Darstellung der Subfolders aus dem Laufwerk C: länger als 2 Sekunden braucht.
Werden die Subfolders angezeigt, wird wieder nur Count der Subsubfolder von der einzelnen SubFolder geprüft und dann das Treeview zur Anzeige eines Plus gebracht, wenn Subfolders vorhanden sind.
Du hast es also mit einem Design-Fehler zu tun. Du nutzt die Werkzeuge falsch. Deine Treeview muss zum Start nicht mit allen Daten versorgt sein, sondern die werden dynamisch mit dem Benutzerverhalten dazugeladen.
Beitrag wurde zuletzt am 01.09.16 um 20:08:17 editiert. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 02.09.16 16:39 |
| Hallo Blackbox,
das war auch mein erster Gedanke. Aber mit ADIR() ist das TreeView in 60 Sec gefüllt.
Hab einfach das ausprobiert:
fso = CREATEOBJECT("Scripting.FileSystemObject")
FOR F = 1 TO 10000
THISFORM.CAPTION = STR(F)
v_1 = fso.GetFolder("C:\Dokumente und Einstellungen\Herr\.gradle\...
v_2 = v_1.SubFolders
ENDFOR
Das dauert auch ohne TreeView sehr lange.
Wiederhole ich den Code wird es noch langamer. Es verlangsamt sich überproportional.
Gebe ich danach im Befehlsfenster CLEAR ALL ein, dauert die Ausführung auch sehr lange.
Gruß HELMUT | |
Fix und fertiger TreeView für Laufwerke / Ordner / Dateien | | | Autor: visualfx | Datum: 02.09.16 18:35 |
| Hallo Helmut,
das FileSystemObject kenne ich nur dem Namen nach, benutzt habe ich es bisher noch nicht.
Wenn Du allerdings alle Laufwerke und Ordner und Dateien in einem TreeView anzeigen willst, kannst Du folgendes benutzen:
- entweder GETFILE() von VFP, zeigt Namen korrekt an, sieht aber etwas altbacken aus
- oder das Mscomm32.ocx ActiveX-Control/-Steuerelement
die zugehörige Hilfedatei lautet: Cmdlg98.chm
Setzte das Steuerelement auf eine Form und rufe die Methode ShowOpen auf.
Vor dem Aufruf der Methode ShowOpen kannst Du (mußt aber nicht) mit der Eigenschaft Flags das Verhalten sehr individuell steuern.
Dieser Dialog samt TreeView zeigt Namen auch korrekt an, sieht aber im Gegensatz zu GETFILE() absolut modern aus !!!
Das Steuerelement hat noch weitere Methoden bzw. Dialoge:
- ShowSave
- ShowPrinter
- ShowColor
- ShowFont
- ShowHelp
Gruß, Stefan | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 06.09.16 13:25 |
| Hallo Stefan,
ich muß den Inhalt von Laufwerken in eine Datenbank übertragen und
in einem TreeView sichtbar machen. GERTFILE() oder ShowOpen ist leider
nicht geeignet.
Ich denke, daß FileSystemObject Unmengen Daten puffert ohne diese wieder
frei zu geben. Ohne diesem Problem wäre ich glücklich.
Gruß HELMUT | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 06.09.16 14:11 |
| OK, ich verstehe !
Dann bleibt eigentlich nur entweder unsere erste Lösung:
1) alle Dateien eines Ordners mit FindFirstFile + FindNextFile + FindClose ermitteln und zusätzlich jeweils mit ADIR() weitere Infos abrufen
oder Du kannst das Ganze auch rumdrehen, also:
2) alle Dateien mit ADIR() ermitteln und zusätzlich jeweils den genauen Dateinamen mit FindFirstFile + FindClose abrufen
Ich glaube nämlich, daß die VFP-Funktionen - wie z. B. ADIR(), etc. - super gut optimiert sind !!!
Gruß, Stefan
Beitrag wurde zuletzt am 06.09.16 um 14:13:48 editiert. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 12.09.16 15:33 |
| Hallo Stefan.
Aber wie unterscheide ich mit FindFirstFile... zwischen Datei und Ordner?
Sollte eine Datei den gleichen Namen wie ein Ordner haben wird es zum
Problem kommen.
Gruß HELMUT | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 12.09.16 16:14 |
| Es kann in einem Ordner nicht gleichzeitig einen Ordner und eine Datei mit dem gleichen Namen geben, sondern nur entweder einen Ordner oder eine Datei.
Also wird Dein vermutetes Problem nicht auftreten. Hierbei spielt auch die Schreibweise keine Rolle.
- z. B.: Ordner Test und Datei test geht nicht.
Gruß, Stefan
Beitrag wurde zuletzt am 12.09.16 um 16:20:20 editiert. | |
Re: Function für FoxPro in VB | | | Autor: Helmut FoxPro | Datum: 12.09.16 16:22 |
| Sorry. Das hätte ich vorher testen sollen.
ICH DANKE EUCH VIELMALS !!! | |
Re: Function für FoxPro in VB | | | Autor: visualfx | Datum: 12.09.16 17:26 |
| Kein Problem | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|