Why is the file not opening? - c#

I can't get the file to open.
private void button1_Click(object sender, EventArgs e)
{
// Load the CSV file
var lines = File.ReadAllLines(#"C:\chat.csv");
var xml = new XElement("Chat-Log", // To convert to XML
lines.Select(line => new XElement("Item",
line.Split('|') // indicate split
.Select((column, index) => new XElement("Column" + index, column)))));
xml.Save(#"C:\xml-out.xml"); // Save to XML file
MessageBox.Show("Converted to XML");
FileStream fileStream = new FileStream(#"c:\xmlout.xml", FileMode.Open);
try
{
TextWriter tw = new StreamWriter("c:\\xml-out.xml");
}
finally
{
fileStream.Close();
}
}
The above piece of code should open C:\xml-out.xml, right?
TextWriter tw = new StreamWriter("c:\\xml-out.xml");
I have no idea why it is not opening the file. Any clue?
I tried various options.

For some reason, you're opening a stream and then trying to create a writer for it.
If the file didn't exist before, then the call to new FileStream(#"c:\xmlout.xml", FileMode.Open) will throw an exception... and if the file did exist before, then you won't be able to open a writer to it in the following line because you've still got the file open for reading. You're also then closing the FileStream in the finally block, but never closing the StreamWriter, which is odd.
I expect you've probably got an exception showing which of those is actually causing the problem, but you should certainly remove the statement for the FileStream.
You should use a using statement so you don't need an explicit try/finally block:
using (StreamWriter writer = File.CreateText(#"c:\xml-out.xml"))
{
}
Of course there's then the possibility that you don't have permission to create a file on the root of the file system...

Related

Program saying file already in use but i closed it C# [duplicate]

This question already has answers here:
Do I need to dispose the FileStream object?
(3 answers)
Closed 4 years ago.
private void buttonAdd_Click(object sender, EventArgs e)
{
string path = #"comics.txt";
if (!File.Exists(path))
{
var myComicsFile = File.Create(path);
myComicsFile.Close();
FileStream file = new FileStream("comics.txt", FileMode.Open, FileAccess.ReadWrite);
TextWriter write = new StreamWriter(path);
}
else if (File.Exists(path))
{
FileStream file = new FileStream("comics.txt", FileMode.Open, FileAccess.ReadWrite);
TextWriter write = new StreamWriter(path);
}
}
I keep getting the error System.IO.IOException: 'The process cannot access the file because it is being used by another process'
I thought I had fixed it by closing the file after i created it the opening it but i get the error still. Not sure what the correct solution is. Any help would be greatly appreciated.
Firstly, there is no need to create a file empty and open it, instead use the appropriate FileMode Instead
FileMode.OpenOrCreate
OpenOrCreate
Specifies that the operating system should open a file if it exists;
otherwise, a new file should be created. If the file is opened with
FileAccess.Read, Read permission is required. If the file access is
FileAccess.Write, Write permission is required. If the file is opened
with FileAccess.ReadWrite, both Read and Write permissions are
required.
When you use a BCL method always check the documentation for clues about how to use it, in-particular look for if something supports IDisposable if it does ALWAYS use a using statement when you can
using Statement (C# Reference)
Provides a convenient syntax that ensures the correct use of
IDisposable objects.
in short you could have just done this
using (var file = new FileStream("comics.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)
using(var TextWriter write = new StreamWriter(file))
{
// stuff here
}
Basically, when using a using statement with a stream derivative, it closes and disposes any unmanaged resources like file handles. in your case, you have left the File Handle dangling and hence your problem
Use the “using” statement to ensure file is closed.
Reference:
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
You can nest using to take away a lot of the potential problems (like you have experienced already) by automatically calling dispose. For example
using (FileStream fs = new FileStream("c:\file.txt", FileMode.Open))
{
using (BufferedStream bs = new BufferedStream(fs))
{
using (System.IO.StreamReader sr = new StreamReader(bs))
{
string output = sr.ReadToEnd();
}
}
}

how to clear text file content c#

i want clear text file contet with this method
private void writeTextFile(string filePath, string text)
{
if (!File.Exists(filePath))
{
File.Create(filePath).Close();
}
using (StreamWriter tw = new StreamWriter(filePath))
{
File.WriteAllText(filePath,"");
tw.WriteLine(text);
tw.Close();
}
}
but i get this error
The process cannot access the file because it is being used by another process.
but this not open in anywhere ,
please help me
thank's
That's because you're creating a StreamWriter, then using File.WriteAllText. Your File is already being accessed with the StreamWriter.
File.WriteAllText does just that, writes the entire string you pass to it to a file. StreamWriter is unnecessary if you're going to use File.WriterAllText.
If you don't care about overwriting an existing file, you can do this:
private void writeTextFile(string filePath, string text)
{
File.WriteAllText(filePath, text);
}
If you want to use StreamWriter (which, by the way, File.WriteAllText uses, it just hides it), and append to the file, you can do this (from this answer):
using(StreamWriter sw = File.AppendText(path))
{
tw.WriteLine(text);
}
You can use StreamWriter for creating a file for write and use Truncate to write with clearing previous content.
StreamWriter writeFile;
writeFile = new StreamWriter(new IsolatedStorageFileStream(filename, FileMode.Truncate, myIsolatedStorage));
writeFile.WriteLine("String");
writeFile.Close();
This use FileMode.Truncate
Truncate Specifies that an existing file it to be opened and then truncated so that its size is zero bytes.
Assuming that your file already exists and you want to clear its contents before populating it or whatever, I found the best way to do this with StreamWriter is..
// this line does not create test.txt file, assuming that it already exists, it will remove the contents of test.txt
Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter(Path.GetFullPath(C:\test.txt), False)
// this line will now be inserted into your test.txt file
sw.Write("hey there!")
// I decided to use this solution
// this section is to clear MyFile.txt
using(StreamWriter sw = new StreamWriter(#"MyPath\MyFile.txt", false))
{
foreach(string line in listofnames)
{
sw.Write(""); // change WriteLine with Write
}
sw.Close();
}
// and this section is to copy file names to MyFile.txt
using(StreamWriter file = new StreamWriter(#"MyPath\MyFile.txt", true))
{
foreach(string line in listofnames)
{
file.WriteLine(line);
}
}
You only need to specify false in the second parameter of the constructor for StreamWriter( route, false )
String ruta = #"C:\Address\YourFile".txt";
using (StreamWriter file = new StreamWriter(ruta, false))
{
for ( int i = 0; i < settings.Length; ++i )
file.WriteLine( settings[ i ] );
file.Close();
}
The problem is with you locking the file by initializing StreamWriter onto filePath and then trying to call File.WriteAllText which also internally attempts to lock the file and eventually end up with an exception being thrown.
Also from what it looks you are trying to clear the file's content and then write something in.
Consider the following:
private void writeTextFile(string filePath, string text) {
using (StreamWriter tw = new StreamWriter(filePath, false)) //second parameter is `Append` and false means override content
tw.WriteLine(text);
}
Why not use FileStream with FileMode.Create?
using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
//Do something...
}
Look at the MSDN of FileMode Enum
Create
Specifies that the operating system should create a new file. If the file already exists, it will be overwritten. This requires Write permission. FileMode.Create is equivalent to requesting that if the file does not exist, use CreateNew; otherwise, use Truncate. If the file already exists but is a hidden file, an UnauthorizedAccessException exception is thrown.
Overwritten will cover/remove/clean/delete all existed file data.
if you would like to use StreamWriter, use new StreamWriter(fs).

Issue in create and write in a text file using c#

I try to create a text file and write some data to it. I am using the following code:
public void AddNews(string path,string News_Title,string New_Desc)
{
FileStream fs = null;
string fileloc = path + News_Title+".txt";
if (!File.Exists(fileloc))
{
using (fs = new FileStream(fileloc,FileMode.OpenOrCreate,FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fileloc))
{
sw.Write(New_Desc);
}
}
}
}
I got this exception in stream writer:
The process cannot access the file '..............\Pro\Content\News\AllNews\Par.txt'
because it is being used by another process.
Text file is created, but I can't write to it.
When you create your StreamWriter object, you're specifying the same file that you already opened as a FileStream.
Use the constructor overload of StreamWriter that accepts your FileStream object, instead of specifying the file again, like this:
using (StreamWriter sw = new StreamWriter(fs))
I would simply do this:
public void AddNews(string path, string News_Title, string New_Desc)
{
string fileloc = Path.Combine(path, News_Title+".txt");
if (!File.Exists(fileloc)) {
File.WriteAllText(fileloc, New_Desc);
}
}
Note that I use Path.Combine as a better way to create paths, and File.WriteAllText as a simple way of creating a file and writing something to it. As MSDN says:
If the target file already exists, it is overwritten.
so we first check if the file already exists, as you did. If you want to overwrite its contents, just don't check and write directly.
The issue could be that the file is open or in use. Consider checking if the file is open before writing to it...
public bool IsFileOpen(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
// Is Open
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//Not Open
return false;
}
Good Luck!
using (TextWriter tw = new StreamWriter(path, true))
{
tw.WriteLine("The next line!");
}

cannot write strings to file using '.writeline' method of a streamwriter

I want to write a simple string in a text file using the stream writer class,But it doesn't seem to work(and there are no errors).here's my code:
StreamWriter test = new StreamWriter("mytext.txt", true);
// used the below code too to create the file. It didn't work either!
//StreamWriter test = File.CreateText("mytext.txt");
test.WriteLine("hello");
when I run this code,nothing will be added to the text file!Where did I go wrong?(ps:I used the full path file names too!but it didn't work!)
using(StreamWriter test = new StreamWriter("mytext.txt", true)){
test.WriteLine("hello");
}
problem is that the buffer of your stream is not flushed ... you could either call flush() or make sure it is properly disposed by the using block ...
You have to close the connection in order to write to the file.
Best practice is simply using using.
There is no problem in updating a file after creating it. But you must always take care of the stream.
using (StreamWriter test = new StreamWriter("mytext.txt", true))
{
test.WriteLine("File created");
}
//Do Stuff...
using (StreamWriter test = new StreamWriter("mytext.txt", true))
{
test.WriteLine("hello");
}
Do you have the file open in another program like notepad++?

How to get a file and move it out of the isolated storage?

I want to take a file that stored already in the isolated storage, and copy it out, somewhere on the disk.
IsolatedStorageFile.CopyFile("storedFile.txt","c:\temp")
That doesn't work. Throws IsolatedStorageException and says "Operation not permitted"
I don't see anything in the docs, other than this, which just says that "Some operations aren't permitted", but doesn't say what, exactly. My guess is that it doesn't want you copying out of isolated storage to arbitrary locations on disk. The docs do state that the destination can't be a directory, but even if you fix that, you still get the same error.
As a workaround, you can open the file, read its contents, and write them to another file like so.
using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForAssembly())
{
//write sample file
using (Stream fs = new IsolatedStorageFileStream("test.txt", FileMode.Create, store))
{
StreamWriter w = new StreamWriter(fs);
w.WriteLine("test");
w.Flush();
}
//the following line will crash...
//store.CopyFile("test.txt", #"c:\test2.txt");
//open the file backup, read its contents, write them back out to
//your new file.
using (IsolatedStorageFileStream ifs = store.OpenFile("test.txt", FileMode.Open))
{
StreamReader reader = new StreamReader(ifs);
string contents = reader.ReadToEnd();
using (StreamWriter sw = new StreamWriter("nonisostorage.txt"))
{
sw.Write(contents);
}
}
}

Categories

Resources