Menu

#934 C# example code doesn't release file properly

Usability
pending-works-for-me
None
5
2015-07-02
2015-06-28
Etienne
No

I'm using MediaInfo with C#. After calling this method, it doesn't release the file properly. I cannot delete or rename a file after reading it with this.

How can I properly release the file?

private MediaInfo ReadMediaFile(string fileName) {
    //Initilaizing MediaInfo
    MediaInfo MI = new MediaInfo();

    //From: preparing an example file for reading
    FileStream From = new FileStream(fileName, FileMode.Open, FileAccess.Read);

    //From: preparing a memory buffer for reading
    byte[] From_Buffer = new byte[64 * 1024];
    int From_Buffer_Size; //The size of the read file buffer

    //Preparing to fill MediaInfo with a buffer
    MI.Open_Buffer_Init(From.Length, 0);

    //The parsing loop
    do {
        //Reading data somewhere, do what you want for this.
        From_Buffer_Size = From.Read(From_Buffer, 0, 64 * 1024);

        //Sending the buffer to MediaInfo
        System.Runtime.InteropServices.GCHandle GC = System.Runtime.InteropServices.GCHandle.Alloc(From_Buffer, System.Runtime.InteropServices.GCHandleType.Pinned);
        IntPtr From_Buffer_IntPtr = GC.AddrOfPinnedObject();
        Status Result = (Status)MI.Open_Buffer_Continue(From_Buffer_IntPtr, (IntPtr)From_Buffer_Size);
        GC.Free();
        if ((Result & Status.Finalized) == Status.Finalized)
            break;

        //Testing if MediaInfo request to go elsewhere
        if (MI.Open_Buffer_Continue_GoTo_Get() != -1) {
            Int64 Position = From.Seek(MI.Open_Buffer_Continue_GoTo_Get(), SeekOrigin.Begin); //Position the file
            MI.Open_Buffer_Init(From.Length, Position); //Informing MediaInfo we have seek
        }
    }
    while (From_Buffer_Size > 0);

    //Finalizing
    MI.Open_Buffer_Finalize(); //This is the end of the stream, MediaInfo must finnish some work

    return MI;
}

Discussion

  • Jerome Martinez

    Jerome Martinez - 2015-06-29

    The code you are using is an example of how to use MediaInfo "by buffer" interface, so MediaInfo handles no file properties. It is impossible for MediaInfo to block something about the file because MediaInfo is not aware of a file (it is aware of a memory buffer, that's all).

    This is only an example, adapt it for your needs.

    I don't know a lot about C#, maybe the Close method is not called automaticly, and called only when the garbage collector does its job?

    Try to add From.Close() before returning the object.

     
  • Jerome Martinez

    Jerome Martinez - 2015-06-29
    • summary: MediaInfo doesn't release file properly --> C# example code doesn't release file properly
    • status: open --> pending-works-for-me
    • assigned_to: Jerome Martinez
    • Group: Crash --> Usability
     
  • Etienne

    Etienne - 2015-07-02

    Oh, the bug is in C#? Yes, indeed, the problem is in these few lines.

    "From" is the file stream and it isn't being closed. Adding this line at the end solves the problem.

    From.Close();

     

Log in to post a comment.