Toon posts:

[C++] bestanden in dir?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik werk aan project waarbij ik log files maak. Deze logfiles komen in een directory te staan.
In deze log files staan (per log file verschillend) een aantal sequences.
ik wil in een scherm weergeven wat het gemiddeld aantal sequences per log file is!
Daar heb ik een aparte methode voor aangemaakt.
Ik moet eerst kijken of de directory waar die log files staan bestaat.
En daarna moet ik kijken of er al log files staan.
want wanneer er geen log files staan krijg ik melding: Division bij zero (en terecht)
Dus als er geen log files staan moet ik dus gewoon een waarde nul terug krijgen.
De vraag is nu wat moet ik voor IF , FOR, WHILE lus maken waarmee hij dus controleerd op bestanden en zoja dan die deling van aantal sequences met logfiles maakt

Met wat hieronder staat ben ik aan het knutselen geweest maar verder weet ik het echt niet meer...

Kan iemand mij helpen??

alvast bedankt

if (DirectoryExists(logDir)) /* kijken of dir bestaat lukt wel */
{
DirectoryListBox1->Directory = logDir;
DirectoryListBox1->Update();
FileListBox1->Update();
if(FileExists(fileName)) /* vanaf hier gaat het mis */
{ /* is er 1 file? ja ga dan in lus */
totalNumberOfSequences = GetTotalNumberOfSequences();
totalNumberOfLogs = GetTotalNumberOfLogs();
averageNumberOfSequences = StrToInt(totalNumberOfSequences)/StrToInt(totalNumberOfLogs);
returnString = averageNumberOfSequences;
}
}
return returnString; /* zo niet geef dan een nul waarde terug */
}

  • Reptile209
  • Registratie: Juni 2001
  • Nu online

Reptile209

- gers -

Gaat het nou mis OP of NA die if(FileExists())? En wat gaat er dan mis en hoe? 'k Snap eerlijk gezegd je probleem niet helemaal dus...

Zo scherp als een voetbal!


Verwijderd

Topicstarter
Het opzoeken of de directory bestaat gaat nog goed.
Maar nu is mijn vraag: Met welke code kan ik kijken of er een log file in die directory staat en als er een(of meerder) log file staat dat ik dan die deling ga doen.
staat er geen logfile dan moet ik een waarde nul terug krijgen

dat stukje van if(fileNameExists(fileName)
klopt volgens mij al niet meer

Verwijderd

Stukje uit MSDN :

FindFirstFile
The FindFirstFile function searches a directory for a file whose name matches the specified filename. FindFirstFile examines subdirectory names as well as filenames.

HANDLE FindFirstFile(
LPCTSTR lpFileName, // pointer to name of file to search for
LPWIN32_FIND_DATA lpFindFileData
// pointer to returned information
);

Parameters
lpFileName
Windows 95: Pointer to a null-terminated string that specifies a valid directory or path and filename, which can contain wildcard characters (* and ?). This string must not exceed MAX_PATH characters.
Windows NT: Pointer to a null-terminated string that specifies a valid directory or path and filename, which can contain wildcard characters (* and ?).

There is a default string size limit for paths of MAX_PATH characters. This limit is related to how the FindFirstFile function parses paths. An application can transcend this limit and send in paths longer than MAX_PATH characters by calling the wide (W) version of FindFirstFile and prepending "\\?\" to the path. The "\\?\" tells the function to turn off path parsing; it lets paths longer than MAX_PATH be used with FindFirstFileW. However, each component in the path cannot be more than MAX_PATH characters long. This also works with UNC names. The "\\?\" is ignored as part of the path. For example, "\\?\C:\myworld\private" is seen as "C:\myworld\private", and "\\?\UNC\bill_g_1\hotstuff\coolapps" is seen as "\\bill_g_1\hotstuff\coolapps".

lpFindFileData
Pointer to the WIN32_FIND_DATA structure that receives information about the found file or subdirectory. The structure can be used in subsequent calls to the FindNextFile or FindClose function to refer to the file or subdirectory.
Return Values
If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or FindClose.

If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.

Remarks
The FindFirstFile function opens a search handle and returns information about the first file whose name matches the specified pattern. Once the search handle is established, you can use the FindNextFile function to search for other files that match the same pattern. When the search handle is no longer needed, close it by using the FindClose function.

This function searches for files by name only; it cannot be used for attribute-based searches.

QuickInfo
Windows NT: Requires version 3.1 or later.
Windows: Requires Windows 95 or later.
Windows CE: Requires version 1.0 or later.
Header: Declared in winbase.h.
Import Library: Use kernel32.lib.
Unicode: Implemented as Unicode and ANSI versions on Windows NT.

See Also
File I/O Overview, File Functions, FindClose, FindNextFile, GetFileAttributes, SetFileAttributes, WIN32_FIND_DATA

Verwijderd

Topicstarter
Hier snap ik nog niet veel van. sorry!
moet ik eerst deze functie gebruiken in een if lus of eerst gewoon gebruiken en uitkomst in if lus??

is er geen makkelijkere manier?

niet dat ik ondankbaar ben maar dit lijkt me moeilijker dan denk ik nodig is???

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

er bestaat geen if lus

de tip is dat je de winapi functies FindFirst en FindNext moet gebruiken en vergeet de dirlistbox en filelistbox

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

en anders snappen we je probleem niet kennelijk

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Maar door die FindFirst weet kan ik dus bepalen of er een *.log in de log directory staat.
En als die er dus is moet ik dus nog die deling gaan doen van aantal sequences met logfiles.
En als die er dus niet is moet ik waarde nul terug krijgen hoe doe ik dat dan?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:12

Creepy

Tactical Espionage Splatterer

flykiller: D.m.v. findfirst en findnext kan je opzoeken of er files in een directory staan.

Maar als je al een filelistbox gebruikt kan je dat daarmee ook opzoeken natuurlijk. Kijk eens in de help zou ik zeggen (hint: in je code op FileListBox1 gaan staan en op F1 drukken!)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Dames En Heren De Oplossing.
Ik ben misschien niet geheel duidelijk geweest maar er schoot me te binnen dat ik al een functie had die het aantal logfiles uit een directory ophaalde.
Toen dacht ik: als ik deze functie nou aanroep en zolang hij niet 0 is mag hij dus die deling uitvoeren en anders geeft hij een waarde nul terug.

Toch bedankt voor de hulp


AnsiString TLogForm::GetAverageNumberOfSequences()
{
AnsiString logDir = StressTestSettingsWindow->GetLogDirectory();
AnsiString totalNumberOfSequences = GetTotalNumberOfSequences();
AnsiString totalNumberOfLogs = GetTotalNumberOfLogs();
AnsiString averageNumberOfSequences = 0;

if(DirectoryExists(logDir))
{
DirectoryListBox1->Directory = logDir;
DirectoryListBox1->Update();
FileListBox1->Update();
if(totalNumberOfLogs != 0)
{
averageNumberOfSequences = StrToInttotalNumberOfSequences)/ StrToInt (totalNumberOfLogs);
}
}
return averageNumberOfSequences;
}

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Hehe, dus als ik het goed begrijp heb je je n00b vraag aardig kunnen verbergen door net te doen of je problemen had met het vinden van de bestanden? :p

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Dus het enige probleem wat je had was dat je niet wist hoe je de deling door 0 kon voorkomen? |:(
Sorry maar da's geen vraag voor hier...

  • MisterE
  • Registratie: April 2002
  • Laatst online: 28-08 19:15
als ik ff op dit onderwerp mag inspringen.
Ik gebruik ook de findfirst etc (in delphi), maar de files worden niet (allemaal) gesorteerd op alfabet. Weet iemand hier iets over??

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ja: Er is geen garantie dat iets op wat voor manier dan ook gesorteerd is. Dat zal je zelf moeten doen. Bijvoorbeeld door de namen in een gesorteerde TStringList te stoppen.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

sterker nog : dat WIL je ook helemaal niet... Het voordeel is nu dat als je aan een niet gesorteerde lijst voldoende hebt, dat sneller gaat wanneer de functie zelf al zou sorteren.
Als je een gesorteerde lijst wil, schrijf je toch zelf gewoon een functie die een gesorteerde lijst met bestandsnamen returned? Prop die functie in een van je eigen-brouwsel libraries en klaar :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Verwijderd schreef op 27 september 2002 @ 01:46:
sterker nog : dat WIL je ook helemaal niet... Het voordeel is nu dat als je aan een niet gesorteerde lijst voldoende hebt, dat sneller gaat wanneer de functie zelf al zou sorteren.
Als je een gesorteerde lijst wil, schrijf je toch zelf gewoon een functie die een gesorteerde lijst met bestandsnamen returned? Prop die functie in een van je eigen-brouwsel libraries en klaar :)
Of beter nog, roep gewoon std:sort aan. Wie zelf een sort schrijft is niet lui genoeg om te programeren

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Wat ik dus bedoelde was NIET dat ie zelf de sorting functie schrijft, maar een wrapper om het hele FindFirst gebeuren heen, dus (algoritme) :

1. Findfirst
2. Is er een bestand?
Ja : Ga naar 3
Nee : Ga naar 8
3. Voeg bestand toe aan lijst
4. Findnext
5. Is er een bestand?
Ja : Ga naar 6
Nee : Ga naar 8
6. Voeg bestand toe aan lijst
7. Ga naar 4
8. Sorteer lijst m.b.v. std::sort (of wat de voorkeur geniet)
9. Return gesorteerde lijst
Of beter nog, roep gewoon std:sort aan. Wie zelf een sort schrijft is niet lui genoeg om te programeren
Of kent de std library niet...
Of probeert zelf iets te leren van het schrijven van een sorteer algoritme...
;)

  • MisterE
  • Registratie: April 2002
  • Laatst online: 28-08 19:15
Verwijderd schreef op 27 september 2002 @ 01:46:
sterker nog : dat WIL je ook helemaal niet... Het voordeel is nu dat als je aan een niet gesorteerde lijst voldoende hebt, dat sneller gaat wanneer de functie zelf al zou sorteren.
Als je een gesorteerde lijst wil, schrijf je toch zelf gewoon een functie die een gesorteerde lijst met bestandsnamen returned? Prop die functie in een van je eigen-brouwsel libraries en klaar :)
nou ff nadenkend over wat findfirst doet. Het lijkt me dat hij het eerste file pakt uit de FAT en die terugleverd, en dan verder gaat.
maw, windows WEET hoe de bestanden heten dus hoeft ie ze toch ook niet te sorteren??
Het lijkt me toch niet dat ie elke combinatie af gaat ???

  • MisterE
  • Registratie: April 2002
  • Laatst online: 28-08 19:15
btw: waarom zijn sommige files dan WEL gesorteerd, heeft dat iets met de 'creation time' te maken?

  • Reptile209
  • Registratie: Juni 2001
  • Nu online

Reptile209

- gers -

Puur toeval. Natuurlijk "weet" Windows hoe de bestanden heten, maar in tegenstelling tot een standaard explorer-venster is een FAT niet gesorteerd. Dus krijg je alleen een gesorteerd resultaat als:
1. je het zelf sorteert :X
2. er door een mazzeltje een gesorteerde FAT is.

(bij 2: vroeger had je van die tooltjes die de FAT voor je sorteerden... DOS rulez :P)

De FAT is gewoon een lijst waar nieuwe bestanden aan het einde worden toegevoegd, of over "oude" entries heengezet worden. No more, no less. Volgorde == random.

Zo scherp als een voetbal!


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
MisterE schreef op 27 september 2002 @ 21:05:
[...]


nou ff nadenkend over wat findfirst doet. Het lijkt me dat hij het eerste file pakt uit de FAT en die terugleverd, en dan verder gaat.
Bijna goed. File(names) worden niet gevonden in de FAT. De FAT is de File Allocation Table, en die geeft alleen aan waar cluster N+1 staat die bij cluster N hoort. De directories bevatten de eerste cluster van elke file, en de file naam.
De directories zelf zijn als ik het me goed herinner 16 byte records, 8 bytes naam, 3 bytes extensie, 4 bytes eerste cluster en 1 byte attributen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1