Hello Neil,
Your WEB server code sharing is a very nice move (and a lot of hard work), however I don't think that your expectations about FTP server on AVR are realistic. I looked at AVR Freaks projects, and could not find any FTP server (or client) code at all. Then I googled around the world, and I was not be able to find a single AVR FTP server implementation, and the only FTP client implementation was deprecated ATMEGA103 299$ "AVR Embedded Internet Toolkit". I couldn't even find an Arduino FTP server or client implementation (that's when I started to wonder). The only AVR FTP clients I found use TCP/FTP stack from GPRS modems that usually have some ARM inside. After all, I have found one FTP client in embedded C
here, but no sign of 8-bit MCU FTP servers at all (at least with my search keywords). Looking at Indy FTP server component implementation I see 253Kb source (without 20 other included units), and although I haven't looked at FTP protocol specification at all, this tells me much. If FTP server is a must, I would use CodeTyphon/Lazarus/FPC on some commercial ARM Linux board instead and save my self a lot of trouble, or connect AVR to some cheap hackable ARM Linux router if it is a home project.
If all you want is to save your MMC card and connectors from tearing, then maybe you could try a different approach. You could deliver historical data as a simple HTML page. If user asks in his web browser for url like this one:
http://avrwebserver/hist/20110604, you can intercept it and render in runtime virtual HTML page from your historical data like this:
Code
DATA START
00:00:04 SENSOR1VALUE SENSOR2VALUE SENSOR3VALUE
00:00:10 SENSOR1VALUE SENSOR2VALUE SENSOR3VALUE
..
23:59:57 SENSOR1VALUE SENSOR2VALUE SENSOR3VALUE
DATA END
CSV or any other format is also more then acceptable. That way human can see data if he needs, and custom PC program (or Excel) can parse that data and store history in a database if you want to. You don't need much memory or other resources since you already have implemented HTTP and HTML page is generated in runtime from your MMC historical data. You can even execute commands from PC to AVR using virtual url like this
http://avrwebserver/del/20110604. AVR can simply interprete this url request as a MMC file delete command.