1

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:

  1. how is it possible that the program works in some computer and in some not?
  2. will you put the file in a different place other then the program folder?

(sorry for my English)

John Saunders
  • 160,644
  • 26
  • 247
  • 397
samy
  • 1,949
  • 6
  • 39
  • 64
  • Are you sure you haven't modified your user folder with specific security permissions? – Tejs Nov 08 '12 at 19:01
  • I thought .NET paths were relative... you shouldn't need the exe path if the file is in the same folder.. – Justin Self Nov 08 '12 at 19:01
  • I have edited your title. Please see, "[Should questions include “tags” in their titles?](http://meta.stackexchange.com/questions/19190/)", where the consensus is "no, they should not". – John Saunders Nov 08 '12 at 19:02
  • @Tejs im not sure i understand. i only trying to get a file in the program folder. – samy Nov 08 '12 at 19:04
  • @justnS intresting, but how will you change the way i get the file? – samy Nov 08 '12 at 19:04
  • 1
    @JohnSaunders you modified the title, yet you still left all those grammatical mistakes in it :-) Samy - is that path you get in your exception correct? Is the file supposed to be somewhere else? Or is your problem that the file doesn't get deployed in the installation? – neeKo Nov 08 '12 at 19:10
  • @NikoDrašković im realy not sure. becuse clickonce dosnt realy creat a install folder in the program files. the only file i see is the fourmlinks.txt in the app data folder. (is that answer you questin?) – samy Nov 08 '12 at 19:20
  • So are you creating this file after install, or are you deploying it with the application? – neeKo Nov 08 '12 at 19:22
  • deploying it with the application :) – samy Nov 08 '12 at 19:22
  • 2
    If you have the .txt file in your Visual Studio solution, open its properties and set `Copy To Output = Copy Always`. You should be able to access the file with `FileInfo file = new FileInfo("filename.txt");` (if it's in the root folder of the project). I've just tested it, it works on Win 7 when deployed with clickonce. No idea about XP. – neeKo Nov 08 '12 at 19:32
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/19303/discussion-between-niko-draskovic-and-samy) – neeKo Nov 08 '12 at 19:33

1 Answers1

5
How is it possible that the program works in some computer and in some not?

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:

file not found 'C:\Users\eli\AppData\Roaming\fourmlinks.txt'

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 you put the file in a different place other then the program folder

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.

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "fourmlinks.txt");

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.

string path = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),
    "fourmlinks.txt");

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 to System.Reflection.Assembly.GetExecutingAssembly().Location. Then your application should do something like:

string fileName = "fourmlinks.txt";
string target = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), fileName);
if (!File.Exists(target))
{
    string source = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), fileName);
    File.Copy(source, target);
}

Another important difference between GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) and Environment.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).

Dour High Arch
  • 21,513
  • 29
  • 75
  • 90
  • wow! thank you for all the info. but i have a question: will this code work on XP?`Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)` – samy Nov 08 '12 at 20:37
  • @Samy, that is .NET code. If the XP machine has .NET installed it will work. – Dour High Arch Nov 08 '12 at 23:51
  • what's about IsolatedStorage ? – Kiquenet Sep 12 '13 at 11:54
  • @Kiquenet, you can use Isolated storage instead of `Environment.SpecialFolder.ApplicationData` for desktop apps that require administrator quotas. Did you have a problem using it? If so, post a question. – Dour High Arch Sep 12 '13 at 16:44