Qn: Kom omkring Windows File Lockup Property - ved hjælp af FileHandling i Java eller C #

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg støder på et problem med at udvikle en software til min virksomhed. Opgaven, jeg forsøger at nå, er, at jeg skal opdatere en fil (.txt), mens den pågældende fil konstant åbnes af et andet program.


Den ultimative indstilling er dette: Jeg vil have en software, der løbende læser indholdet af en feedfil (kald det info.txt). Jeg har et andet script, der løbende opdaterer foderfilen (info.txt).


Jeg indså den alvorlige konflikt i at bruge filen, efter at jeg implementerede ovenstående indstilling. Med softwaren (kald det AAA) kører, kan jeg ikke lave en redigering til info.txt selv manuelt. Jeg åbner info.txt, foretag en ændring og klik på Gem, Windows returnerer en fejlmeddelelse: 'Processen kan ikke få adgang filen, fordi den bliver brugt af en anden proces. 'Hvis jeg forsøger at slette info.txt, er fejlmeddelelsen' handlingen kan ikke afsluttes, fordi filen er åben i AAA.exe '.
Når jeg kører mit (java) script, der løbende opdaterer info.txt, er filen IO-undtagelsen: java.io.FileNotFoundException: info.txt (Processen kan ikke få adgang til filen, fordi den bruges af en anden proces)


Software AAA er ikke så godt udviklet. (Det er en udenlandsk software til min virksomhed, så jeg kan ikke ændre sin adfærd/kildekode.) Den måde, hvorpå der er adgang til filer, låser hele filen op. Jeg tænkte på tempereret at pege på henvisningen til info.txt i softwares profilfiler for at gøre det muligt at redigere en temparation, men denne tilgang ville mislykkes, fordi AAA kører (og jeg har brug for det), kan jeg ikke ændre enhver fil den bruger.


Jeg konsulterede en af ​​de vigtigste udviklere af software AAA. Han erkender, at dette er et problem lige nu, han ville forbedre det i næste udgave. Men i mellemtiden vil jeg gerne sætte mig i gang med arbejdet. Han fortalte mig, at han programmer med .NET, og han gav en linje, som kunne hjælpe mig med at komme rundt om mit problem:


FileStream fs=nyt FileStream (@ 'info.txt', FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);


Formentlig ved at levere disse argumenter, kan denne filestream deles på både skriver og læser.


Jeg er en Java-programmør, og jeg har ikke haft nogen erfaring med .NET. Men jeg gjorde lidt forskning og læring, jeg indså, at hans kode er syntaxen til C #, som løber i CLR i .NET-rammerne. Jeg oprettede C # på min computer og studerede nogle C # beginer tutorial, og kommer op med følgende script, håber at løse mit problem.


Hvis det er rigtigt sandt at C # tillader at ændre adgangsegenskaberne til en fil på et grundlæggende niveau, ville jeg åbne filestream af info.txt, så det kunne deles med både læs og skrive. Når jeg gør det, jeg kan køre mit script til opdatering info.txt, og derefter køre software AAA, der holder forfriskende info.txt.


Forsøger at nå ovenstående implementering, kommer jeg op på et C # script:


================================================


using System;
using System.IO;

class CopyFeed
{
    static void Main()
    {
        string fileName1 = "info.txt";  
        string fileName2 = "info2.txt";


        FileStream fs = new FileStream(@fileName1, FileMode.OpenOrCreate,             FileAccess.Write, FileShare.ReadWrite);
        StreamWriter sw = null;

        // attempting to unlock part of the file, didn't work
        /*
        string contents = File.ReadAllText(@fileName2);
        fs.Unlock(0, contents.Length * 2);
        */

        while (true)
        {
            Console.WriteLine("Copying Feed...");

            string contents = File.ReadAllText(@fileName2);

            try
            {
                sw = new StreamWriter(fs);
                sw.Write(contents);
            }
            catch (Exception e)
            {
                Console.WriteLine("CopyFeed :: " + e.Message);
            }
            finally
            {
                if (sw != null)
                {

                    sw.Flush();
                    //sw.Close();

                }
            }

            Console.WriteLine("Pausing For 2 sec...");
            System.Threading.Thread.Sleep(2000);

        }



    }
}


================================================


Formentlig vil jeg have mit java script konstant opdatering info2.txt. Så vil jeg have dette C # script konstant kopiere hele indholdet af info2.txt til info.txt.
 Jeg ønsker at søge hjælp med dette indlæg i 2 aspekter:



  1. Ovenstående script er stadig buggy, fordi alt det gør, er vedhæftet fil info.txt. Jeg ønsker at finde en måde, som jeg kan rydde indholdet af fil i starten af ​​hver iteration og bare kopiere over indholdet af file2. Lige nu, hvis jeg udfører scriptet, vil det skabe en uendelig stor fil som tiden går.

  2. På baggrund af ovenstående beskrivelse går min løsning på arbejde? Har jeg nogen bedre mulighed? (med software AAA adfærd forbliver den samme) Er der endda en måde at komme rundt om det?

  3. Kan jeg finde en løsning ved hjælp af Java? har Java filhåndtering, der interagerer med Windows-systemet på et mere grundlæggende niveau og låser filen op?



Jeg har arbejdet på dette problem de sidste par dage og er virkelig fast. Jeg vil oprigtigt takke enhver, der giver noget indsigt!

Bedste reference


Jeg kan ikke fortælle dig, om den metode, du beskrive, fungerer for at få adgang til den låste fil, da jeg ikke har et sådant scenario tilgængeligt til testning.


Hvad angår dit spørgsmål 1.):


Du kan rydde indholdet af en fil med den statiske metode File.WriteAllText (navneområde System.IO ). Dette svarer til [6]


string contents = File.ReadAllText(@fileName2);


i den C # kode, du har indsendt.


Eksempel:


System.IO.File.WriteAllText(@"C:Test	est.txt", "");


eller bedre


System.IO.File.WriteAllText(@"C:Test	est.txt", string.Empty);


Alternativt kan du bruge setLength-metoden til din FileStream med værdien 0: [7]


fs.SetLength(0);

Andre referencer 1


Mens din metode forhindrer en FileNotFoundException i at forekomme i dit program, bør du overveje muligheden for at forårsage den samme undtagelse for andre programmer, der forsøger at få adgang til den fil, du redigerer.


Mit arbejde har en lignende brugstilfælde, og vi grænseflader med versionskontrol i stedet for filen direkte. På denne måde kan vi fusionere ændringer, hvis der foretages samtidige redigeringer.


Hvis du ikke er fortrolig med denne fremgangsmåde, skal du i det mindste ændre din kode for at fange for System.IO.FileNotFoundExceptions i stedet for System.Exception.