List only *.csv files

okay I worked it out it was the sdfile reference it was meant to be SdFileBase all working and writing to the log file the last issues is it only seems to be logging the first name and a bit

#include <SdFat.h>
#include <SdFile.h>

// SD chip select pin
const uint8_t chipSelect = SS;

// file system object
SdFat sd;
SdFile file;
SdBaseFile lFile;
uint16_t count;		// count of files
char fname[12];
char file_list[] = "FILELIST.TXT";
char *CSV_EXT = "CSV"; 
#define SD_SELECT 4

// define a serial output stream
ArduinoOutStream cout(Serial);
//------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
           
pinMode(10,OUTPUT);
digitalWrite(10,HIGH);
 
 
if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

Serial.println("Program started");

if (lFile.open(file_list, O_CREAT|O_WRITE));

 count = 0;
 while (file.openNext(sd.vwd(), O_READ))
	{  

    	if (file.isFile())
		{ file.getFilename(fname);
		if (strcmp(CSV_EXT, &fname[strlen(fname)-strlen(CSV_EXT)]) == 0){
   Serial.print("File added ");              
  Serial.println(fname);
                lFile.write(fname, 12);			
  	         //sdlog << (fname,12) << endl;
				count++;
			}
		}
		file.close();
	
}
  Serial.println("");
Serial.print("File Count ");
Serial.print(count); 
}
 


void loop() {}

no idea what I have done but this is what is getting logged now

?????V?????T??????????????????

Serial print out

program started
3V_FILE.CSV
TEST.CSV
10000101.CSV
10000219.CSV
10000308.CSV
Count 5

current code

#include <SdFat.h>
#include <SdFile.h>

// SD chip select pin
const uint8_t chipSelect = SS;

// file system object
SdFat sd;
SdFile file;
SdBaseFile lFile;
uint16_t count;		// count of files
int const file_size =12;
char fname[file_size];
char file_list[] = "FILELIST.TXT";
char *CSV_EXT = "CSV"; 
#define SD_SELECT 4

// define a serial output stream
ArduinoOutStream cout(Serial);
//------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
           
pinMode(10,OUTPUT);
digitalWrite(10,HIGH);
 
 
if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

Serial.println("program started");

if (lFile.open(file_list, O_CREAT|O_WRITE));

 count = 0;
 while (file.openNext(sd.vwd(), O_READ))
	{  
    	if (file.isFile())
		{ file.getFilename(fname);
		if (strcmp(CSV_EXT, &fname[strlen(fname)-strlen(CSV_EXT)]) == 0){
                Serial.println(fname);
                lFile.write(fname, file_size);			
  	        count++;
			}
		}
		file.close();
	
}
lFile.close();

Serial.print("Count ");
Serial.print(count); 

}
 


void loop() {}

okay I have got a bit further now it is logging all the filename
it ended up to do with

lFile.write(fname, 12);

if the file is not 12 characters it will stuff it up so I got rid of the shorter name files now am a stuck to how to get it to write a new line instead of putting them all in a line any ideas?

10000101.CSV10000219.CSV10000308.CSV

#include <SdFat.h>
#include <SdFile.h>
#include <SdBaseFile.h>

// SD chip select pin
const uint8_t chipSelect = SS;

// file system object
SdFat sd;
SdFile file;
SdBaseFile lFile;
uint16_t count;		// count of files
int const file_size =12;
char fname[file_size];
char file_list[] = "FILELIST.TXT";
char *CSV_EXT = "CSV"; 
#define SD_SELECT 4

// define a serial output stream
ArduinoOutStream cout(Serial);
//------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
           
pinMode(10,OUTPUT);
digitalWrite(10,HIGH);
 
 
if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

Serial.println("program started");

if (lFile.open(file_list, O_CREAT|O_WRITE));

 count = 0;
 while (file.openNext(sd.vwd(), O_READ))
	{  
    	if (file.isFile())
		{ file.getFilename(fname);
		if (strcmp(CSV_EXT, &fname[strlen(fname)-strlen(CSV_EXT)]) == 0){
                Serial.println(fname);
                lFile.write(fname, 12);			
  	        count++;
			}
		}
		file.close();
	
}
lFile.close();

Serial.print("Count ");
Serial.print(count); 

}
 


void loop() {}

'\n' is the newline character.

Serial.print("Hello\n");

is the same as

Serial.println("Hello");

okay I have almost got everything I need working, I have removed the need to log the information to file and got it to processes straight away to an ftp now I just need to check if the file being processed matches a set file name and skip it or if not delete it

this is the bit of code I am have issues with so what I what I am trying to resolve is if the fname = "10000219.CSV" skip else delete the file

int const file_size =13;
char fname[file_size];
char dname[file_size];
char file_list[13] = "10000219.CSV";



 if (fname == file_list)
               { 
                Serial.print ("Todays File"); 
               }
               else
               {
               dfile.open(fname);
               dfile.remove();
                Serial.print("File Removed");	
  	        }

this code works a treat it uploads each file one at a time.

/*
   FTP passive client for IDE v1.0.3 and w5100/w5200
   Posted orginally posted by SurferTim re Edited by Onenate 18/02/2013 works with SDFat libary 
   orginal code only works with sd.h libary remove download option only upload to server
   http://playground.arduino.cc//Code/FTP
*/

#include <SdFat.h>
#include <SdFatUtil.h>
#include <SdFile.h>
#include <SdBaseFile.h>
#include <SPI.h>
#include <Ethernet.h>

// comment out next line to write to SD from FTP server
#define FTPWRITE
#define error(s) error_P(PSTR(s))

// this must be unique
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };  

// change to your network settings
IPAddress ip( 192, 168, 3, 177 );    
IPAddress gateway( 192, 168, 3, 254 );
IPAddress subnet( 255, 255, 255, 0 );


// SD chip select pin
const uint8_t chipSelect = SS;

// file system object
SdFat sd;
SdFile file;
SdBaseFile lFile;
uint16_t count;		// count of files
int const file_size =13;
char fname[file_size];
char dname[file_size];
char file_list[13] = "10000219.CSV";
char *CSV_EXT = "CSV"; 
#define SD_SELECT 4


/************ SDCARD STUFF ************/
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile dfile;
SdBaseFile ufile;
SdFat remove;

// change to your server
//IPAddress server(serverName);
char serverName[] = "update.ftp.com.au";

EthernetClient client;
EthernetClient dclient;

char outBuf[128];
char outCount;

// change fileName to your file (8.3 format!)
//char fileName[13] = "10000219.CSV";


ArduinoOutStream cout(Serial);
//...............errors..................
void error_P(const char* str) {
  PgmPrint("error: ");
  SerialPrintln_P(str);
  if (card.errorCode()) {
    PgmPrint("SD error: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
  while(1);
}

void setup()
{
  Serial.begin(9600);

  pinMode(10,OUTPUT);
  digitalWrite(10,HIGH);

  if(sd.begin(4) == 0)
  {
    Serial.println("SD init fail");          
  }

Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  //root.openRoot(volume);
  
  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);


  Ethernet.begin(mac, ip, gateway, gateway, subnet); 
  digitalWrite(10,HIGH);
  delay(2000);
  Serial.println("Ready. Press f ");
}

void loop()
{
  byte inChar;

  inChar = Serial.read();

  if(inChar == 'f')
  { callfile();
    Serial.println("FTP OK");
     }

  }
  
  
  
  
void callfile()
{
 count = 0;
 while (file.openNext(sd.vwd(), O_READ))
	{  
    	if (file.isFile())
		{ file.getFilename(fname);
		if (strcmp(CSV_EXT, &fname[strlen(fname)-strlen(CSV_EXT)]) == 0){
                Serial.println(fname);
                doFTP();
               if (fname == file_list)
               { 
                Serial.print ("Todays File"); 
               }
               else
               {
               dfile.open(fname);
               dfile.remove();
                Serial.print("File Removed");	
  	        }

                count++;
			}
		}
		file.close();
	
}
}

byte doFTP()
{


  Serial.println("SD opened");

  if (client.connect(serverName,21)) {
    Serial.println("Command connected");
  } 
  else {
    ufile.close();
    Serial.println("Command connection failed");
    return 0;
  }

  if(!eRcv()) return 0;

  client.write("USER username\r\n");  // change your username here 

  if(!eRcv()) return 0;

  client.write("PASS password\r\n"); // change your password here 

  if(!eRcv()) return 0;

  client.write("SYST\r\n");

  if(!eRcv()) return 0;

  client.write("PASV\r\n");

  if(!eRcv()) return 0;

  char *tStr = strtok(outBuf,"(,");
  int array_pasv[6];
  for ( int i = 0; i < 6; i++) {
    tStr = strtok(NULL,"(,");
    array_pasv[i] = atoi(tStr);
    if(tStr == NULL)
    {
      Serial.println("Bad PASV Answer");    

    }
  }

  unsigned int hiPort,loPort;

  hiPort = array_pasv[4] << 8;
  loPort = array_pasv[5] & 255;

  Serial.print("Data port: ");
  hiPort = hiPort | loPort;
  Serial.println(hiPort);

  if (dclient.connect(serverName,hiPort)) {
    Serial.println("Data connected");
  } 
  else {
    Serial.println("Data connection failed");
    client.stop();
    ufile.close();
    return 0;
  }

  Serial.println("open file");
 ufile.open(fname,O_READ);

  client.write("STOR ");
  client.println(fname);

  if(!eRcv())
  {
    dclient.stop();
    return 0;
  }

  Serial.println("Writing");
  byte clientBuf[64];
  int clientCount = 0;

  while(ufile.available())
  {
    clientBuf[clientCount] = ufile.read();
    clientCount++;

    if(clientCount > 63)
    {
      Serial.println("Packet");
      dclient.write(clientBuf,64);
      clientCount = 0;
    }
  }

  if(clientCount > 0) dclient.write(clientBuf,clientCount);


  dclient.stop();
  Serial.println("Data disconnected");

  if(!eRcv()) return 0;

  client.write("QUIT\r\n");

  if(!eRcv()) return 0;

  client.stop();
  Serial.println("Command disconnected");
 
  ufile.close();
  Serial.println("SD closed");
  return 1;
}




byte eRcv()
{
  byte respCode;
  byte thisByte;

  while(!client.available()) delay(1);

  respCode = client.peek();

  outCount = 0;

  while(client.available())
  {  
    thisByte = client.read();    
    Serial.write(thisByte);

    if(outCount < 127)
    {
      outBuf[outCount] = thisByte;
      outCount++;      
      outBuf[outCount] = 0;
    }
  }

  if(respCode >= '4')
  {
    efail();
    return 0;  
  }

  return 1;
}


void efail()
{
  byte thisByte = 0;

  client.write("QUIT\r\n");

  while(!client.available()) delay(1);

  while(client.available())
  {  
    thisByte = client.read();    
    Serial.write(thisByte);
  }

  client.stop();
  Serial.println("Command disconnected");
  ufile.close();
  Serial.println("SD closed");
}

This

(fname == file_list)

will never do what you expect it to do. You are comparing if the addresses (pointers) of the two strings are the same.

If you want to compare whether the strings are the same you need to use the strcmp() function, like you were in previous code to compare the file extension.

thanks for that works a treat

    if (strcmp(fname,file_list) == 0)

now I just need to get it to delete the file it just does not seem to work with anything I try if, I open the file then delete it, or just try and delete it still no luck.

dfile.open(fname);
               dfile.remove();
                Serial.print("File Removed");

okay if I add the remove file command it does not complete the files are still their, it also stuff up the uploading of the file

but I need to remove these files some how.

any ideas

Have you tried any of the examples for the libraries to see how you can use remove()

yer I have checked out the remove commands and everything I have tried nothing seems to deleted it ,

Another strange issue it does not seem to loop it only list the files ones then that it any ideas why or what I should change?

#include <SdFat.h>
#include <SdFile.h>
#include <SdBaseFile.h>

// SD chip select pin
const uint8_t chipSelect = SS;

// file system object
SdFat sd;
SdFile file;
SdBaseFile lFile;
uint16_t count;		// count of files
int const file_size =12;
char fname[file_size];
char file_list[] = "FILELIST.TXT";
char *CSV_EXT = "CSV"; 
#define SD_SELECT 4

// define a serial output stream
ArduinoOutStream cout(Serial);
//------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
           
pinMode(10,OUTPUT);
digitalWrite(10,HIGH);
 
 
if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

Serial.println("program started");


}
 


void loop() {
delay(500);
count = 0;
 while (file.openNext(sd.vwd(), O_READ));
	{  
    	if (file.isFile())
		{ file.getFilename(fname);
		if (strcmp(CSV_EXT, &fname[strlen(fname)-strlen(CSV_EXT)]) == 0){
                Serial.println(fname);
                count++;
			}
		}
		file.close();
	
}
count = count = 0;
}

I think I need to put this in to the code but not too sure how

sd.vwd()->rewind();

if I try this

#include <SdFat.h>
#include <SdFile.h>
#include <SdBaseFile.h>


// SD chip select pin
const uint8_t chipSelect = SS;

// file system object
SdFat sd;
SdFile file;
SdBaseFile lFile;
SdFile root;
SdVolume volume;
uint16_t count;		// count of files
int const file_size =12;
char fname[12];
char file_list[] = "FILELIST.TXT";
char *CSV_EXT = "CSV"; 
#define SD_SELECT 4

// define a serial output stream
ArduinoOutStream cout(Serial);

#define error(s) 

//------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
           
pinMode(10,OUTPUT);
digitalWrite(10,HIGH);
 
 
if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

Serial.println("program started");


}
 


void loop() {
delay(500);
call();

 //Serial.print("test");
 
}
void call()
{

 if (count == 6)
{
 sd.vwd()->rewind();
} 
  

 count = 0;

 while (file.openNext(sd.vwd(), O_READ));
	{  
    	if (file.isFile())
		{ file.getFilename(fname);
		if (strcmp(CSV_EXT, &fname[strlen(fname)-strlen(CSV_EXT)]) == 0){
                Serial.println(fname);
                count++;
			}
      		}
  file.close();
	
}

I only get the follow printing out

program started
10001210.CSV
10000607.CSV
10001009.CSV
10000101.CSV
10000219.CSV
10000308.CSV

I would expect when it hit the 6 recorded it rewinds it and will start over again but no luck

You should check that the file actually exists, before you try to delete it.

You are trying to do too many things at once. Try reading the names of all of the files
on the SD card, first. Get that to work. And then you can just stop printing the
names of the files which are not CSV files.

If the SD card system allows file names longer than the old DOS 8.3 system, then you should
read them. There is no reason why you can't allocate a longer array to contain your file names.

apposed to trying to delete the files.

how can I make the

while (file.openNext(sd.vwd(), O_READ));

repeat it has the close file at the end of it but it I rerun the command it does not relist the contents of the sd card

any ideas?

any ideas?

Yes. Slow down. Think before you type. Use capital letters and punctuation where needed.

That makes parsing your sentences a lot easier.

Your last post makes little sense.

I get told off for it all the time :slight_smile:

Let me try and explain what I am trying to do.

I want to open the SD card and read through the files and check for any CSV files let say every 10 -15 min, if it finds any it will run an FTP command to upload all the *.csv files stored on the SD card, if the file that it is processing does not equal to the current log file it deletes it, as I have no need to store an old file on the SD card.

 count = 0;

 while (file.openNext(sd.vwd(), O_READ));
	{  
    	if (file.isFile())
		{ file.getFilename(fname);
		if (strcmp(CSV_EXT, &fname[strlen(fname)-strlen(CSV_EXT)]) == 0){
                Serial.println(fname);
                count++;
			}
      		}
  file.close();
	
}

If I run that command a second time I only get 1 or 2 files not all the file that are stored on the SD card.

I know that
it has been
suggest that
you use
Tools + Auto Format
to properly indent
your code.

http://snippets-r-us.com is still waiting for your snippets. Here, we need to see ALL of your code.

Paul thanks for the tip on the auto format it cleaned up the code and it was soo easy.

here is the full code

#include <SdFat.h>
#include <SdFatUtil.h>
#include <SdFile.h>
#include <SPI.h>
#include <Ethernet.h>

// comment out next line to write to SD from FTP server
#define FTPWRITE
#define error(s) error_P(PSTR(s))

// this must be unique
byte mac[] = { 
  0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };  

// change to your network settings
IPAddress ip( 192, 168, 3, 177 );    
IPAddress gateway( 192, 168, 3, 254 );
IPAddress subnet( 255, 255, 255, 0 );


// SD chip select pin
const uint8_t chipSelect = SS;

// file system object
SdFat sd;
SdFile uploadfile;
uint16_t count;		// count of files
int const file_size =13;
char fname[file_size];
char dname[file_size];
char file_list[13] = "10000219.CSV";
char *CSV_EXT = "CSV"; 
#define SD_SELECT 4


/************ SDCARD STUFF ************/
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile dfile;
SdBaseFile ufile;

// change to your server
//IPAddress server(serverName);
char serverName[] = "update.ftp.com.au";

EthernetClient client;
EthernetClient dclient;

char outBuf[128];
char outCount;
int CYCCount = 0;

// change fileName to your file (8.3 format!)
//char fileName[13] = "10000219.CSV";


ArduinoOutStream cout(Serial);
//...............errors..................
void error_P(const char* str) {
  PgmPrint("error: ");
  SerialPrintln_P(str);
  if (card.errorCode()) {
    PgmPrint("SD error: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
  while(1);
}

void setup()
{
  Serial.begin(9600);

  pinMode(10,OUTPUT);
  digitalWrite(10,HIGH);

  if(sd.begin(4) == 0)
  {
    Serial.println("SD init fail");          
  }

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  //root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);


  Ethernet.begin(mac, ip, gateway, gateway, subnet); 
  digitalWrite(10,HIGH);
  delay(2000);
}

void loop()
{

if ( CYCCount >= 5000)
{Serail.print() 
  callfile();
 CYCCount = CYCCount =0; 
}

CYCCount =CYCCount +1 ;
}


//***************************************** voids******************************************//

void callfile()
{
  count = 0;
  while (uploadfile.openNext(sd.vwd(), O_READ))
  {  
    if (uploadfile.isFile())
    { 
      uploadfile.getFilename(fname);
      if (strcmp(CSV_EXT, &fname[strlen(fname)-strlen(CSV_EXT)]) == 0){
        //Serial.println(fname);
        doFTP();
        count++;
      }
    }
    delay (1000);
    uploadfile.close();

  }
}

byte doFTP()
{


  Serial.println("SD opened");

  if (client.connect(serverName,21)) {
    Serial.println("Command connected");
  } 
  else {
    ufile.close();
    Serial.println("Command connection failed");
    return 0;
  }

  if(!eRcv()) return 0;

  client.write("USER uesname\r\n");  // change your username here 

    if(!eRcv()) return 0;

  client.write("PASS password\r\n"); // change your password here 

    if(!eRcv()) return 0;

  client.write("SYST\r\n");

  if(!eRcv()) return 0;

  client.write("PASV\r\n");

  if(!eRcv()) return 0;

  char *tStr = strtok(outBuf,"(,");
  int array_pasv[6];
  for ( int i = 0; i < 6; i++) {
    tStr = strtok(NULL,"(,");
    array_pasv[i] = atoi(tStr);
    if(tStr == NULL)
    {
      Serial.println("Bad PASV Answer");    

    }
  }

  unsigned int hiPort,loPort;

  hiPort = array_pasv[4] << 8;
  loPort = array_pasv[5] & 255;

  Serial.print("Data port: ");
  hiPort = hiPort | loPort;
  Serial.println(hiPort);

  if (dclient.connect(serverName,hiPort)) {
    Serial.println("Data connected");
  } 
  else {
    Serial.println("Data connection failed");
    client.stop();
    ufile.close();
    return 0;
  }

  Serial.println("open file");
  ufile.open(fname,O_READ);

  client.write("STOR ");
  client.println(fname);

  if(!eRcv())
  {
    dclient.stop();
    return 0;
  }

  Serial.println("Writing");
  byte clientBuf[64];
  int clientCount = 0;

  while(ufile.available())
  {
    clientBuf[clientCount] = ufile.read();
    clientCount++;

    if(clientCount > 63)
    {
      Serial.println("Packet");
      dclient.write(clientBuf,64);
      clientCount = 0;
    }
  }

  if(clientCount > 0) dclient.write(clientBuf,clientCount);


  dclient.stop();
  Serial.println("Data disconnected");

  if(!eRcv()) return 0;

  client.write("QUIT\r\n");

  if(!eRcv()) return 0;

  client.stop();
  Serial.println("Command disconnected");

  ufile.close();
  Serial.println("SD closed");
  return 1;
}




byte eRcv()
{
  byte respCode;
  byte thisByte;

  while(!client.available()) delay(1);

  respCode = client.peek();

  outCount = 0;

  while(client.available())
  {  
    thisByte = client.read();    
    Serial.write(thisByte);

    if(outCount < 127)
    {
      outBuf[outCount] = thisByte;
      outCount++;      
      outBuf[outCount] = 0;
    }
  }

  if(respCode >= '4')
  {
    efail();
    return 0;  
  }

  return 1;
}


void efail()
{
  byte thisByte = 0;

  client.write("QUIT\r\n");

  while(!client.available()) delay(1);

  while(client.available())
  {  
    thisByte = client.read();    
    Serial.write(thisByte);
  }

  client.stop();
  Serial.println("Command disconnected");
  ufile.close();
  Serial.println("SD closed");

}

Okay I worked out the rewind function, see the updated void loop with the rewind before it calls the open next command.

Now I just need to work out how to ping the IP address of the server before it starts the FTP .

Also Delete the file the uploaded file once processed.

void loop()
{

if ( CYCCount >= 5000)
{
  Serial.println("FTP upload Started "); 
    sd.vwd()->rewind();
   callfile();
 CYCCount = CYCCount =0; 
}
Serial.println(CYCCount); 
CYCCount =CYCCount +1 ;
}