i made a program that uses a pre-made text file that hold a list of sites. now in some computer the program works fine but, in my friend computer it doesn't.
i check the program on 2 of my windows 7 computers, and 1 xp and i don't have any errors. this program was used for some time on XP, now my friend want to install it in his windows 7 computer at home, but the program doesn't find the file after he install the program.
this is the error he get:
System.IO.FileNotFoundException: file not found 'C:\Users\eli\AppData\Roaming\fourmlinks.txt'.
file name: 'C:\Users\eli\AppData\Roaming\fourmlinks.txt'
the thing is that i ship the this file in main program folder (Application Files), and it still cant find it.
this is the code i use to find the file when the program starts:
sring path = "";
path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\fourmlinks.txt";
System.OperatingSystem osInfo = System.Environment.OSVersion;
if (osInfo.Platform == PlatformID.Win32NT)
{
if (osInfo.Version.Major == 5 && osInfo.Version.Minor != 0)
{
//running XP
//path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\fourmlinks.txt";
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\fourmlinks.txt";
}
}
you can see, that i tried to make sure it will work on windows 7 and, windows xp.
NOTE: i don't mind changing the way i work with this file, or even loss this way and try completely different way that will work on the OS's (win 7 and XP). if u suggest me new way, i will be glad to give a try out.
my questions:
- how is it possible that the program works in some computer and in some not?
- will you put the file in a different place other then the program folder?
(sorry for my English)
Because the program depends on something specific to a computer, and this something is different between the two computers. For example, your error message says:
The program is looking for a file in the Users folder; that is specific to every user on every machine, different users and different machines will have different files.
Will I? No, I can't because I'm not that user on that machine. If you mean "can my program put the file in a different place ..." then yes, it can.
That will get a path to the logged-on user's private application data. If you have the "fourmlinks.txt" file in this folder on your machine but someone else doesn't have this file on their machine, then that will work on your machine but not on someone else's, as you asked.
That will get the path to the installed file. If both you and someone else install the program, then both you and someone else will have the file. If either of you change the file, then the other gets the changes.
So should you always use
GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
? Well, that depends.GetExecutingAssembly().Location
is typically a place standard users cannot write to, only read from. If you want users to only read and never write to your data, then that is a good place to put it. If you don't, then it isn't.If you want to create a new file for users to write to and to read from, then write to
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
. If you want to install some starting data with your application but allow the user to change it, then you should include the starting data file in your application. It will get installed toSystem.Reflection.Assembly.GetExecutingAssembly().Location
. Then your application should do something like:Another important difference between
GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
andEnvironment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
is that the former is part of your installer packages; if the user uninstalls or updates your application all their runtime changes will be deleted.If you want each user to have their own private data that does not get deleted when the application is modified, then you want to use
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
.