Domanda

sto testando un codice che ha bisogno di usare FileInfo e DirectoryInfo oggetto e, invece di scrivere un wrapper e diverse interfacce per risolvere questo, ho pensato che sarebbe stata una buona idea creare alcuni file quando si avvia il test e quindi eliminare quelli file dopo il test è fatto. Questo è il mio modo di creare i file:

public static void CreateTestSchedules(int quantity)
{
    String folder = Path.Combine(Directory.GetCurrentDirectory(), "FolderFiles");
    for(int quantity=10; quantity > 0; quantity--)
    {
       String filename = Path.GetTempFileName();
       using (FileStream fileStream = File.Create(Path.Combine(folder, filename)))
       {
            XDocument fileContent = Helper.CreateContent(filename);
            Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(fileContent.ToString());

            fileStream.Write(bytes, 0, bytes.Length);
            fileStream.Flush();
            fileStream.Close();
        }
     }
}

A questo punto, non vedo un problema. I file vengono creati nella cartella e guarda tutto bene

Poi, quando l'esecuzione del test continua, cerco di aprire uno di questi file in qualcosa di scrittura in essa, e ottengo un'eccezione che indica il file che voglio aprire per la scrittura è utilizzato da un altro processo e, dopo aver verificato con maggiore dettaglio, vedo il processo TestDriven.Net come quello bloccare il file. Questo è il codice che uso per aprire e provare a scrivere i dati nel file:

using (FileStream file = new FileStream(filename, FileMode.Append))
{
    Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(dataToWrite.ToString());
    if (file.CanWrite)
    {
        file.Write(bytes, 0, bytes.Length);
    }
}

La mia domanda è: perché sta succedendo questo? Non sono rilasciare l'handle di file in modo corretto? c'è una via per rubare il blocco da TestDriven.Net? dovrei essere la creazione di questo file in modo diverso? dovrei scrivere il test in qualche altro modo?

Grazie in anticipo per le risposte e commenti =).

Modifica

risolvere questo specifico problema (il vero problema, come Dave Swersky accennato, è che l'Unità di test dovrebbe Non toccare il file system) che ho usato il link inviato da James Wiseman (grazie ancora James =) e ha creato il file con una bandiera FileShare, in questo modo posso raggiungere nel file, aprirlo una scrittura ad esso. In questo modo:

 using (FileStream fileStream = new FileStream( filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**))

Con questo posso aprire e scrivere il al file. =)

È stato utile?

Soluzione

ho notato che si sta utilizzando direttamente l'oggetto FileStream per eseguire la scrittura.

Fa lo stesso problema presente se si crea un oggetto StreamWriter, e l'uso che per le operazioni sui file (compreso il vicino)?

Una ricerca su Google alzato questo articolo. Si possono trovare utile. http://foson.blogspot.com/2007/10 /closing-filestream-and-streamwriter-and.html

Altri suggerimenti

Questo probabilmente non è la risposta che state cercando, ma questo è esattamente il motivo per cui si dovrebbe usare schernisce e non effettivamente creare file.

Ecco una soluzione pronta all'uso per beffardo il file system: http: //bugsquash.blogspot.com/2008/03/injectable-file-adapters.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top