I am having some luck writing to a usb stick file, but only the “first” write seems to come through…i want to eventually have a loop that appends more & more information…this simple example only seems to append garbage…i only get the first message (“four score and”);…where is it going wrong?
// Assume one storage device is available,
// access it through NETMF
string rootDirectory = VolumeInfo.GetVolumes()[0].RootDirectory;
FileStream FileHandle = new FileStream(rootDirectory + @ "\hellome.txt", FileMode.Create);
byte[] data = Encoding.UTF8.GetBytes("four score and");
byte[] data1 = Encoding.UTF8.GetBytes(" seven hundred years ago");
// write the data and close the file
FileHandle.Write(data, 0, data.Length);
FileHandle.Close();
FileHandle = new FileStream(rootDirectory + @ "\hellome.txt", FileMode.Append);
FileHandle.Write(data1, 0, data1.Length);
FileHandle.Close();
// if we need to unmount
ps.UnmountFileSystem();
neither of these additions worked properly to append (do 2 writes) to a file.
the first write always works and appear in the file
2)the second gives garbage or strangely has a piece of some prior test phrase that was used, even if it that made using a different file name.
I got: four score andll go in the file! (the last part was a phrase used with a different file name)
The code:
// access it through NETMF
string rootDirectory = VolumeInfo.GetVolumes()[0].RootDirectory;
FileStream FileHandle = new FileStream(rootDirectory + @ "\hellome1.txt", FileMode.Create);
byte[] data = Encoding.UTF8.GetBytes("four score and");
byte[] data1 = Encoding.UTF8.GetBytes(" seven hundred years ago");
// write the data and close the file
FileHandle.Write(data, 0, data.Length);
FileHandle.Close();
FileHandle.Dispose();
FileHandle = new FileStream(rootDirectory + @ "\hellome1.txt", FileMode.Append);
FileHandle.Write(data1, 0, data1.Length);
FileHandle.Close();
FileHandle.Dispose();
VolumeInfo.GetVolumes()[0].FlushAll();
// if we need to unmount
ps.UnmountFileSystem();
private readonly ArrayList _queuedMessages = new ArrayList();
//add the error to our internal log
_queuedMessages.Add("testing......");
FileName = @ "\USB\BugReport.txt" ;
lock (this) // locking the file so no other function tries opening the file while still writing it to it.
{
using (var stream = new FileStream(FileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)
)
using (TextWriter writer = new StreamWriter(stream))
{
foreach (var queuedMessage in _queuedMessages)
{
writer.WriteLine(queuedMessage);
}
writer.Flush();
_queuedMessages.Clear();// clear the internal log since we have written it to the file.
}
}
Hi Gus,
Codeshare wasn’t available at the time, it was disabled. so i uploaded it to the wiki to not lose the code…
i’ll see if i can move it there…
thanks.
i tried a bunch of variations based on the last (JAYJAY) post…none seem to work…in this last try , I tried the stream with both a direct string (see below )& also tried using data1 & data instead of the direct strings…all just give Garbage.
how can you simply add a few extra strings to a file (will eventually do it in a loop)?
// Assume one storage device is available,
// access it through NETMF
string rootDirectory = VolumeInfo.GetVolumes()[0].RootDirectory;
FileStream FileHandle = new FileStream(rootDirectory + @ "\hellome1.txt", FileMode.Create);
byte[] data = Encoding.UTF8.GetBytes("four score and");
byte[] data1 = Encoding.UTF8.GetBytes(" seven hundred years ago");
TextWriter writer = new StreamWriter(FileHandle);
writer.WriteLine("this is a test");
writer.WriteLine("this is the next section of text");
writer.WriteLine("last but not least");
// write the data and close the file
writer.Flush();
FileHandle.Close();
FileHandle.Dispose();
VolumeInfo.GetVolumes()[0].FlushAll();
// if we need to unmount
ps.UnmountFileSystem();
i get:
°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóô
One good thing to do usually is to run similar code in emulator to see what output you will get. I am not sure if this applies to file system code but it is not a bad idea to try.
[quote]One good thing to do usually is to run similar code in emulator to see what output you will get. I am not sure if this applies to file system code but it is not a bad idea to try.
[/quote]
since this is to write on a mem stick & is a complex operation, i’m not sure if that would show anything, or how it would relate to the file system operations…In any case does anyone really know how to do this?
Write one string
then add another
then add another
…but interestingly none of this text is from this program version…it creates the file (there was no debugreport file), but some old text from elsewhere?appears & none of the text from this run is included…the code must be running, since it creates the proper file name
Can you try this on your system & see if you get the same result?
static void DeviceConnectedEvent(USBH_Device device)
{
if (device.TYPE == USBH_DeviceType.MassStorage)
{
Debug.Print("USB Mass Storage detected...");
ps = new PersistentStorage(device);
ps.MountFileSystem();
}
}
static void RemovableMedia_Insert(object sender, MediaEventArgs e)
{
Debug.Print("Storage \"" + e.Volume.RootDirectory +
"\" is inserted.");
Debug.Print("Getting files and folders:");
if (e.Volume.IsFormatted)
{
string[] files = Directory.GetFiles(e.Volume.RootDirectory);
string[] folders =
Directory.GetDirectories(e.Volume.RootDirectory);
Debug.Print("Files available on " +
e.Volume.RootDirectory + ":");
for (int i = 0; i < files.Length; i++)
Debug.Print(files[i]);
Debug.Print("Folders available on " +
e.Volume.RootDirectory + ":");
for (int i = 0; i < folders.Length; i++)
Debug.Print(folders[i]);
Thread.Sleep(1111);
ArrayList _queuedMessages = new ArrayList();
//add the error to our internal log
_queuedMessages.Add("testing......");
_queuedMessages.Add("wow this works"); // these should appear in the file...but do not
_queuedMessages.Add("FULL STEAM AHEAD!");
string FileName = @ "\USB\BugReport.txt" ;
{
using (var stream = new FileStream(FileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)
)
using (TextWriter writer = new StreamWriter(stream))
{
foreach (var queuedMessage in _queuedMessages)
{
writer.WriteLine(queuedMessage);
}
writer.Flush();
_queuedMessages.Clear();// clear the internal log since we have written it to the file.
}
}
ps.UnmountFileSystem();
Yes Eric is correct, knowing the type of board you’re using would help…
i also recommend you download my Exception logger and use it as is, assuming you have a Gadgeteer compatible board… if not please start a new project and include only the code mentioned earlier…