I just ran into a nasty problem with an ISO download from Microsoft.  I successfully burnt it to a rewritable DVD, and copied the contents to the local hard drive on another machine, but when I went to run them they were corrupt.  It turns out the download had been truncated.

Now, OK, sometimes that happens - but it surprised me that the truncated file (which was only slightly more than 60% of the actual ISO) burnt successfully and seemed to be presenting me with a sensible file system, to the extent that I could (apparently) successfully copy the files.

So, is there some way I could have tested the file to see if it was complete or not?  The MS web site did not provide any information about the expected size, so I'm looking for a generic solution: given an ISO file which may or may not be truncated, is there some way to tell?  Do commonly used CD/DVD (data) formats include any embedded information about how much data is supposed to be on the disk, or even better, some kind of CRC?

A solution that detects most truncated images will be accepted, it doesn't need to be perfect.  (I'd prefer something that doesn't give false positives, though.)

[Addendum: a comparison of the disk burnt with the truncated image with the files extracted from the full image suggests that chunks of the data from many of the files were replaced with random information, perhaps from the contents of a previous burn to the same rewritable disk.]


Question: Array Binding simple example doesn't work
Answer: Ok, I found a solution using ObservableCollection: the xaml file remains the same, but the c# class changes this way:

public sealed partial class MainPage : Page
    {        
        public static readonly DependencyProperty RotationsProperty = 
            DependencyProperty.Register("Rotations", typeof(ObservableCollection&lt;double&gt;), typeof(MainPage),
            new PropertyMetadata(new ObservableCollection&lt;double&gt;()));       

        public ObservableCollection&lt;double&gt; Rotations
        {
            get { return (ObservableCollection&lt;double&gt;)GetValue(RotationsProperty); }
            set { SetValue(RotationsProperty, value); }
        }

        private void Op_Click(object sender, RoutedEventArgs e)
        {
            Rotations[0] = 180;
            Rotations[1] = 180;
            Rotations[2] = 320;
        }

        public MainPage()
        {
            this.InitializeComponent();
            Rotations.Add(90);
            Rotations.Add(90);
            Rotations.Add(90);
        }
    }