[C#]Raar gedrag tijdens veranderen van bestand attributen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
De volgende code zou een kopie van de fileName.xml moeten maken en de readonly flag op false zetten. Tijdens runtime wordt in "if (!fileInfo.Exists)" scope de file aangemaakt en is zichtbaar in de map na het verlaten van de scope verdwijnt de file echter. Wat is hier aan de hand en wat doe ik verkeerd, of begrijp ik de fileInfo.IsReadOnly niet helemaal goed?
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
try
{
    //Check whether a file with .original exists
    FileInfo originalFileInfo = new FileInfo(m_directory + @"\fileName.xml");
    FileInfo fileInfo = new FileInfo(m_directory + @"\fileName.original");
    if (!fileInfo.Exists)
    {
        File.Copy(originalFileInfo.FullName, fileInfo.FullName);
        fileInfo.IsReadOnly = false;
     }

     if (originalFileInfo.IsReadOnly)
     {
         originalFileInfo.IsReadOnly = false;
         saveFile();
         originalFileInfo.IsReadOnly = true;
      }
      else
      {
          saveFile();
       }
}
catch (System.Exception ex)
{
    MessageBox.Show(ex.Message, "File Error", MessageBoxButton.OK, MessageBoxImage.Error);
}

[ Voor 11% gewijzigd door NC83 op 08-10-2009 18:57 ]

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 17-09 10:39

Cloud

FP ProMod

Ex-moderatie mobster

Volgens mij begrijp je de IsReadOnly flag wel goed, althans dat lijkt me gezien de documentatie. :) Wat echter ontbreekt in je startpost is de code van de saveFile() methode. Misschien gaat daar iets fout? Want verder zie ik niet echt waarom die file weer zou moeten verdwijnen eigenlijk.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

fileInfo.Exists geeft hier altijd true terug, ik denk dat je dat verkeerd gebruikt.

Even testen :)

Afbeeldingslocatie: http://tweakers.net/ext/f/LOah9dLV9dXvYv3GMuoZayjs/thumb.png

Dit is echt gek? :|

[ Voor 46% gewijzigd door Snake op 08-10-2009 19:16 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Probeer eens fileInfo.Exists te vervangen met

File.Exists(fileInfo.FullName)

:)


Zelfde probleem. Ik heb je fileName van fileName.original veranderd naar fileName.original.xml en dan werkt het wel?

Ik heb nog even wat doorgetest met dit script:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    class Program
    {
        static void Main(string[] args)
        {
            const string directory = @"D:\Personal\";

            try
            {
                FileInfo fileInfoOriginal = new FileInfo(Path.Combine(directory, "fileName.original"));

                //does the file with the .original exists
                if(!fileInfoOriginal.Exists)
                {
                    //no
                    Debugger.Break();
                }
            }
            catch (System.Exception ex)
            {
                Debugger.Break();
            }

        }
    }


Dan werkt het wel met de .original extensie.

Verander ik directory echter naar d:\ werkt het niet. Zelfs al voer ik Visual Studio als Administrator uit.

Misschien een bug gevonden?

[ Voor 103% gewijzigd door Snake op 08-10-2009 19:48 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
Nee na wat nadenk werk en terug vallen op mijn C++ achtergrond begreep ik in eens dat de handle die FileInfo je geeft niet meer geldig is na een copy te hebben gemaakt van de File. Als je fileInfo.Refresh() gebruikt zul je zien dat deze actie niet meer optreed. Als je namelijk naar de fileInfo kijkt na de copy actie zul je zien dat deze nog steeds zegt dat de file niet bestaat.

En ik denk dat je geen runtime error krijgt, wat trouwens wel aardig geweest zou zijn, omdat bij deze API calls staat dat je ze eigenlijk niet moet gebruiken. Ik heb een zwaar vermoeden dat FileInfo en DirectoryInfo maar een hele kleine schil zijn om ofwel COM objecten of directe Win32 API calls.Hierdoor ben je waarschijnlijk op een verkeerde plek in het geheugen aan het schrijven, waardoor alles ineens undefined wordt.

@Cloud
Ik heb de saveFile niet gegeven omdat dit programma voor de baas is en ik al wist dat daar het probleem niet zat. Alles wat de save file functie doet werkt, het bouwt een XmlDocument en schrijft dat weg, ik heb een andere functie in de applicate die precies hetzelfde doet en die werkt. Ik weet dat dat geen garantie is door te steppen in de app heb ik al gezien dat daar geen fouten zitten, zoals ik al aangaf in mijn eerste post zit de fout echt in het punt waar hij de scope verlaat.

[ Voor 24% gewijzigd door NC83 op 08-10-2009 22:41 ]

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

@TS zet verborgen bestanden eens aan en je ziet je .original file.

Heel gek, dat icoontje enzo. En ik kan het hidden attribute ook niet afzetten...

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
Ik had hidden files aanstaan geloof ik, kan het nu niet checken zit thuis en is Win XP niet dat dat iets moet veranderen normaal gezien. Is gewoon raar maar goed ik heb de oplossing dus gevonden door een refresh te doen.

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max

Pagina: 1